Foto: Lalieka, CC BY-SA 4.0, via Wikimedia Commons
Welkom in de drukkerij
Een drukker zette vroeger elke tekst letter per letter, met loden letters uit een kast.
Een computer doet nog altijd hetzelfde: tekst is een rij losse tekens.
Wat leer je in dit hoofdstuk?
Na dit hoofdstuk kan je:
het verschil tussen char en string uitleggen
ASCII en UNICODE situeren en weten hoe .NET tekst bewaart
\escape characters (\n, \t, \", …) gebruiken en weten waarom een Enter uit twee tekens bestaat
@ tekst letterlijk laten staan met het verbatim teken @ of met een raw string literal (""")
tekst samenvoegen en formatteren met string interpolation ($)
speciale UNICODE-tekens en emoji op het scherm tonen
info over de machine ophalen via Environment en je programma afsluiten met een exitcode
Alles is een char
Elk teken dat je intypt is een char
Je toetsenbord toont maar een fractie van alle mogelijke tekens (vergelijk met een Spaans, Tunesisch of Chinees toetsenbord)
Voor we tekst inlezen, moeten we begrijpen hoe een computer al die tekens voorstelt.
ASCII: elk teken een getal
Een afspraak die bepaalt welk teken bij welke waarde hoort
Iedereen die ASCII volgt, kan berichten met die tekens naar elkaar sturen
Maar 128 tekens, want 7 bits
Oorspronkelijk gemaakt om via de Telex te communiceren
De ASCII-tabel
De eerste 128 tekens (bron: Wikipedia).
Tip
De eerste 32 tekens zijn “onzichtbare” stuurtekens: commando’s om oude typemachines aan te sturen (line feed, bell, form feed, …).
UNICODE: de opvolger van ASCII
Door de verdere digitalisering bleek ASCII al snel te klein
UNICODE heeft plaats voor meer dan 1 miljoen tekens: elke letter, smiley en pictogram, wereldwijd op dezelfde manier
De eerste 128 tekens zijn die van ASCII, dus beide zijn compatibel
.NET bewaart een string intern als UTF-16 (er bestaan ook UTF-8 en UTF-32)
Eén kastje, een hele muur
Char en string in C
Char
char eenLetter ='X';Console.WriteLine(eenLetter);
X
'X' Één enkel karakter, tussen apostrofs
Elke char is 16 bits groot: .NET bewaart tekst als UTF-16 (er bestaan ook UTF-8 en UTF-32)
Opmerking
UTF staat voor UNICODE Transformation Format: de manier waarop een UNICODE-waarde in bits wordt bewaard. Het getal is het aantal bits per blokje: UTF-16 werkt met blokjes van 16 bits.
Environment.NewLine kiest zelf het juiste teken voor het systeem waarop je code draait. In je console volstaat \n; zodra je naar een bestand schrijft of over het netwerk verstuurt, begint het verschil te tellen.
Het verbatim teken @
Het apenstaartje @ voor een string zegt: behandel alles letterlijk
string naam ="Finkelstein";Console.WriteLine($@"Je bestanden staan in C:\Users\{naam}\Documents");
Je bestanden staan in C:\Users\Finkelstein\Documents
Tip
Zonder @ compileert dit niet: \U en \D zijn geen geldige escape characters.
Strings samenvoegen
String interpolation met $
Zet een $ voor de string en alles tussen { } wordt als code uitgevoerd:
int leeftijd =13;string naam ="Finkelstein";string zin = $"Ik ben {naam} en ik ben {leeftijd} jaar.";
Je kende dit al uit hoofdstuk 1: op de plek van {naam} komt de inhoud van de variabele.
Expressies in interpolatie
Tussen de accolades mag elke expressie:
string a = $"Ik ben {leeftijd + 4} jaar.";// 17string b = $"Je naam telt {naam.Length} tekens.";// aantal tekensConsole.WriteLine($"3 maal 9 is {3 * 9}");// 27
De expressie
{leeftijd + 4}
wordt eerst berekend
17
dan in de tekst geplaatst
Ik ben 17 jaar.
Formatteren
Plaats een dubbelpunt na de expressie om de weergave te sturen:
double number =12.345;Console.WriteLine($"{number:F2}");// 12,35 (afgerond, niet afgekapt)
F2 kommagetal met 2 cijfers na de komma
D5 geheel getal met minstens 5 cijfers (123 wordt 00123)
E2 wetenschappelijke notatie (12000000 wordt 1,20E+007)
C geldbedrag volgens de landinstellingen
Formatteren met een masker
double number =12.3;Console.WriteLine($"{number:0.00}");// 12,30Console.WriteLine($"{number:000.00}");// 012,30
12,30
012,30
Waarschuwing
Komma of punt hangt van de computer af. Op een Belgisch systeem zie je 12,30, op een Engels 12.30. Dat maakt je uitvoer machine-afhankelijk. Wil je dat vastzetten, dan leer je later CultureInfo kennen.
In je C# code schrijf je je komma’s altijd met een punt**!
De +-operator op strings
+ plakt strings aan elkaar (concatenatie):
string zin ="Ik ben "+ naam +" en ik ben "+ leeftijd +" jaar.";
Zelfde resultaat, maar je let zelf op de spaties en de zin valt in stukken
$ Voor zulke zinnen: interpolatie
Wanneer wél +?
Lange tekst over meerdere lijnen, met + op het lijneinde:
Console.WriteLine("Je wordt wakker in een donkere kamer. "+ $"Het enige licht komt van een scherm, {naam}. "+"Typ START om te beginnen.");
Belangrijk
Elk stuk met accolades heeft zijn eigen $ nodig. Een $ op de eerste lijn geldt niet voor de rest.
Tekst stap voor stap opbouwen met tekst += stuk; (komt terug bij herhalingen, H6).
Opletten met de volgorde bij +
Bij + met strings en getallen door elkaar, van links naar rechts:
Een char gaat maar tot 0xFFFF, en \u verwacht exact vier cijfers. Emoji zitten daarboven. Oplossing? \U i.p.v. \u, en acht cijfers. Of plak de emoji gewoon in je string:
.NET bewaart zo’n teken als twee 16-bit stukjes (een surrogate pair). Eén emoji telt daardoor als 2 in string.Length. Die .Length is dus niet altijd het aantal zichtbare tekens.
Hetzelfde programma geeft op elke machine een andere uitvoer. Test zulke code op meer dan één systeem.
Zelf op ontdekking
Typ in Visual Studio Environment. en kijk wat IntelliSense voorstelt: OSVersion, CurrentDirectory, … Niemand kent élke bibliotheek: het is aan jou om te ontdekken welke nuttig zijn voor jouw probleem.
long geheugen = Environment.WorkingSet;Console.WriteLine($"Dit programma gebruikt {geheugen / 1024 / 1024} MB geheugen");
WorkingSet is het geheugen dat Windows aan je programma toewees. Dat getal verschilt per pc, en zelfs bij elke run.
Programma afsluiten
Environment.Exit(1);
Stopt je programma onmiddellijk. Alles wat erna staat, wordt niet meer uitgevoerd.
Het getal is de exitcode:
0 betekent “alles goed”
elk ander getal betekent “er ging iets mis”
Je zag ze al staan in Visual Studio: exited with code 0
Conclusie
Een char is één teken (een 16-bit getal), een string is een reeks chars
UNICODE (UTF-16 in .NET) volgt ASCII op en bevat meer dan een miljoen tekens
\Escape characters (\n, \t, \") sturen hoe tekst geïnterpreteerd wordt; @ en """ schakelen ze uit
String interpolation ($"...{expressie}...") is de standaardmanier om variabelen in tekst te plaatsen; + vooral om lange tekst over meerdere lijnen te splitsen
Let op de char-val ('A' + 'B' = 131) en op machine-afhankelijke formattering
Environment geeft info over de machine (UserName, MachineName, NewLine) en Exit(0) stopt je programma met een exitcode
Tip
Volgende halte: werken met data: converteren, casten en rekenen.