Je eerste programma verbeteren

First program verbeteren

We nemen terug ons eerste programma erbij en gaan hieraan verder werken:

using System;

namespace Demo1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Console.WriteLine("Hoi, ik ben het");
            Console.WriteLine("Wie ben jij?!");
        }
    }
}

ReadLine: Input van de gebruiker verwerken

Met de console kan je met een handvol methoden reeds een aantal interessante dingen doen.

Zo kan je bijvoorbeeld input van de gebruiker inlezen en bewaren in een variabele als volgt:

using System;

namespace Demo1
{
    internal class JeEersteProgrammaVerbeteren
    {
        private static void Main(string[] args)
        {
            string result;
            result = Console.ReadLine();
        }
    }
}

Bespreking van deze code:

string result;

  • Concreet zeggen we hiermee aan de compiler: maak in het geheugen een plekje vrij waar enkel data van het type string in mag bewaard worden;
  • Noem deze geheugenplek result zodat we deze later makkelijk kunnen in en uitlezen.

result = Console.ReadLine();

  • Vervolgens roepen we de ReadLine methode aan. Deze methode zal de invoer van de gebruiker uitlezen tot de gebruiker op enter drukt.
  • Het resultaat van de ingevoerde tekst wordt bewaard in de variabele result (denk eraan dat de toekenning van rechts naar links gebeurt).

Je programma zou nu moeten zijn:

using System;

namespace Demo1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Hoi, ik ben het!");
            Console.WriteLine("Wie ben jij?!");
            string result;
            result = Console.ReadLine();
        }
    }
}

Start nogmaals je programma. Je zal merken dat je programma nu een cursor toont en wacht op invoer. Je kan nu eender wat intypen en van zodra je op enter duwt gaat het programma verder (in dit geval stopt het programma hierna dus).

Input gebruiker verwerken en gebruiken

We kunnen nu invoer van de gebruiker, die we hebben bewaard in de variabele result, gebruiken en tonen op het scherm.

Console.WriteLine("Dag ");
Console.WriteLine(result);
Console.WriteLine(" hoe gaat het met je?");

In de tweede lijn hier gebruiken we de variabele result (waar de invoer van de gebruiker in bewaard wordt) als parameter in de WriteLine-methode.

Met andere woorden: de WriteLine methode zal op het scherm tonen wat de gebruiker even daarvoor heeft ingevoerd.

Je volledige programma ziet er dus nu zo uit:

using System;

namespace Demo1
{
    public class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Hoi, ik ben het!");
            Console.WriteLine("Wie ben jij?!");

            string result;
            result = Console.ReadLine();

            Console.WriteLine("Dag");
            Console.WriteLine(result);
            Console.WriteLine("hoe gaat het met je?");
        }
    }
}

Test het programma en voer je naam in wanneer de cursor knippert.

Voorbeelduitvoer (lijn 3 is wat de gebruiker heeft ingetypt)

Hoi, ik ben het!

Wie ben jij?!

tim [enter]

Dag

tim

hoe gaat het met je?

Aanhalingsteken of niet?

Wanneer je de inhoud van een variabele wil gebruiken in een methode zoals WriteLine() dan plaats je deze zonder aanhalingsteken! Bekijk zelf eens wat het verschil wordt wanneer je volgende lijn code Console.Write(result); vervangt door Console.Write(“result”);.

De uitvoer wordt dan:

Hoi, ik ben het!

Wie ben jij?!

tim [enter]

Dag

result

hoe gaat het met je?

Write en WriteLine

De WriteLine-methode zal steeds een line break (een ‘enter’) aan het einde van de lijn zetten zodat de cursor naar de volgende lijn springt.

De Write-methode zal geen enter aan het einde van de lijn toevoegen. Als je dus vervolgens iets toevoegt (met een volgende Write of WriteLine) dan zal dit aan dezelfde lijn toegevoegd worden.

Vervang daarom eens de laatste 3 lijnen code in je project door:

Console.Write("Dag");

Console.Write(result);

Console.Write("hoe gaat het met je?");

Voer je programma uit en test het resultaat. Je krijgt nu:

Hoi, ik ben het!

Wie ben jij?!

tim [enter]

Dagtimhoe gaat het met je?

Wat is er verkeerd gelopen? Al je tekst van de laatste lijn plakt zo dicht bij elkaar? Inderdaad, we zijn spaties vergeten toe te voegen! Spaties zijn ook tekens die op scherm moeten komen (ook al zien we ze niet) en je dient dus binnen de aanhalingstekens spaties toe te voegen. Namelijk:

Console.Write("Dag ");
Console.Write(result);
Console.Write(" hoe gaat het met je?");

Je uitvoer wordt nu:

Hoi, ik ben het!

Wie ben jij?!

tim [enter]

Dag tim hoe gaat het met je?

using System;

namespace Demo1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Hoi, ik ben het!");
            Console.WriteLine("Wie ben jij?!");

            string result;
            result = Console.ReadLine();

            Console.Write("Dag ");
            Console.Write(result);
            Console.Write(" hoe gaat het met je?");
        }
    }
}

Opletten met spaties

Spaties zijn ook tekens die op scherm moeten komen (ook al zien we ze niet) en je dient dus binnen de aanhalingstekens spaties toe te voegen. Indien je deze erbuiten plaats dan heeft dit geen effect (je wist al uit het eerste hoofdstuk dat C# alle witregels negeert die niet tussen aanhalingstekens staan). In volgend voorbeeld zijn de spaties aangegeven als liggende streepjes ( _ ).

Fout (de code zal werken maar je spaties worden genegeerd):

Console.Write("Dag"_);

Console.Write(result_);

Console.Write("hoe gaat het met je?");

Correct:

Console.Write("Dag_");

Console.Write(result);

Console.Write("_hoe gaat het met je?");

Een leuke conversatie uit de oude doos:

fuck0ff: hi, does someone here know the escape sequence for a blank?
fuck0ff: hello? a blank ?
fuck0ff: escape sequence like ‘t’ for tab, and blank like the things you do between words. ?
fuck0ff: it’s for a c program
fuck0ff: has the channel #programming anything to do with, like to program?
MadSciFab: why do u need an escape sequence for a blank space?
MakAtak: err.. is that what you call “space”?
Bron: bash.org

String Concatenation – Zinnen aan elkaar plakken

We kunnen dit hele verhaal een pak korter tonen. De plus-operator (+) in C# kan je namelijk gebruiken om variabelen van het type string aan elkaar te plakken. De laatste 3 lijnen code kunnen korter geschreven worden als volgt:

Console.WriteLine("Dag " + result + " hoe gaat het met je?");

Het samenvoegen van een string en een andere variabele noemen we concateneren. Daarom dat deze samengevoegde strings ook geconcateneerde strings genoemd worden. Je herkent hen aan de plus (+) operator(s).

Merk op dat result dus NIET tussen aanhalingstekens staat, in tegenstelling tot de andere stukken zin. Waarom is dit? Aanhalingstekens in C# duiden aan dat een stuk tekst moet beschouwd worden als tekst van het type string. Als je geen aanhalingsteken gebruikt dan zal C# de tekst beschouwen als een variabele met die naam.

Bekijk zelf eens wat het verschil wordt wanneer je volgende lijn code vervangt door de lijn er onder:

Console.WriteLine("Dag "+ result + " hoe gaat het met je?");
Console.Write("Dag "+ "result" + " hoe gaat het met je?");

String interpolation

Als er verschillende strings en variabelen aan elkaar ‘geplakt’ moeten worden is het vaak aangewezen om string interpolation te gebruiken. Met deze techniek schrijven we alles in dezelfde string en moeten we geen gebruik maken van de + operators om elementen samen te voegen. Variabelen worden geplaatst tussen curly braces {variabeleNaam}. Dit is makkelijker om te lezen en vergt vaak minder cpu operaties.

String interpolation herkennen we aan het $ symbool dat voor de string geplaatst wordt.

Console.Write($"Dag {result} hoe gaat het met je?");
Tip: Laat Visual Studio voor je werken. Plaats je cursor in een geconcateneerde string en druk op het icoontje links om een bestaande geconcateneerde (+) string om te zetten naar een interpolated ($) string

Meer input vragen

Als je meerdere inputs van de gebruiker tegelijkertijd wenst te bewaren dan zal je meerdere geheugenplekken nodig hebben om de invoer te bewaren. Bijvoorbeeld:

Console.WriteLine("Geef leeftijd");
string leeftijd;  //eerste geheugenplekje aanmaken
leeftijd = Console.ReadLine();

Console.WriteLine("Geef adres");
string adres; //tweede geheugenplekje aanmaken
adres = Console.ReadLine();

Je mag echter ook de geheugenplekken al vroeger maken. In C# zet men de geheugenplek creatie zo dicht mogelijk bij de code waar je die plek gebruikt (zoals vorig voorbeeld), maar dat is geen verplichting. Dit mag dus ook:

string leeftijd;  //eerste geheugenplekje aanmaken
string adres; //tweede geheugenplekje aanmaken
Console.WriteLine("Geef leeftijd");

leeftijd = Console.ReadLine();
Console.WriteLine("Geef adres");
adres = Console.ReadLine();