This article is currently in the process of being translated into Dutch (~96% done).
De String interpolatie operator
Op een andere plaats in dit tutorial vind je een uitgebreide beschrijving van het string data type, omdat het behandelen van tekst erg belangrijk is. In dit artikel leggen we de focus op een speciale operator om met strings te werken, waardoor je een paar extra 'trucs' kunt doen bij het declareren van strings. Het heet string interpolatie (geïntroduceerd in C# 6.0) en maakt het mogelijk om speciale markeringen in je string te plaatsen, die later door de interpreter worden vervangen door de relevante waarden. Het lijkt erg veel op de String.Format() methode waar we al eerder over hebben gesproken, maar de syntax is leesbaarder en handiger.
String interpolatie is heel simpel te doen - zet vóór de string het $ teken. Zoals altijd duiken we meteen naar een voorbeeld:
string name = "John Doe";
int age = 42;
Console.WriteLine(name + " is " + age + " years old");
Console.WriteLine($"{name} is {age} years old");
In de laatste twee regels doen we precies hetzelfde: eerst op de traditionele manier, waarbij we een string koppelen met onze twee variabelen, en daarna doen we het met string interpolatie. Kijk hoe we variabelen direct in de string kunnen plaatsen door hem te omgeven met accolades. En ook al gebeurt dit binnen de string, dan nog zal de compiler de variabelen checken die jij probeert te 'injecteren'!
De variabelen die je gebruikt hoeven geen simpele types te zijn. Je kunt evengoed properties van complexe objecten gebruiken, precies zoals je zou doen als je gewone string koppeling (concatenatie) zou doen. Hier is een voorbeeld:
var user = new
{
Name = "John Doe",
Age = 42
};
Console.WriteLine($"{user.Name} is {user.Age} years old");
Strings Formatten
De systeemwaarde (default) verandert de variabelen die je maakt in de vereiste string representatie door de ToString() methode toe te passen. Maar soms wil je wat meer controle over hoe elke waarde wordt uitgebeeld, en gelukkig is dat goed te doen dankzij het formatten van strings. Zet gewoon een dubbele punt (:) achter de variabele en toets dan een te gebruiken format string in, zoals in dit voorbeeld:
double daysSinceMillenium = (DateTime.Now - new DateTime(2000, 1, 1)).TotalDays;
Console.WriteLine($"Today is {DateTime.Now:d} and {daysSinceMillenium:N2} days have passed since the last millennium!");
Het resultaat zal er ongeveer zo uitzien, afhankelijk van jouw systeeminstellingen aangaande data en getallen:
Today is Friday, June 29, 2018 and 6,754.49 days have passed since the last millenium!
Zie hoe de datum wordt afgedrukt in het uitgebreide datum format (gespecificeerd met de "D" format string) en het getal is mooi weergegeven met duizendtal separators en twee decimale getallen, dankzij de "N2" numerieke format string.
Als je nog meer controle wilt, kun je van de systeem geformatteerde strings overgaan naar de gewone string format manier, bv voor data (datums):
Console.WriteLine($"Today is {DateTime.Now:yyyy-MM-dd}");
Er zijn veel meer manieren om een DateTime te formatteren dan met een geïnterpoleerde string. Kijk voor alle opties naar de documentatie.
De variabelen voorbij
Nu we variabelen en zelfs properties van objecten in onze strings hebben gebruikt, en we hebben gezien hoe gemakkelijk we de resulterende strings kunnen formatten. Maar string interpolatie gaat verder omdat je hele C# expressies binnen je strings kunt hebben, zolang ze maar resulteren in iets dat kan worden toegevoegd aan een string. Een geweldig voorbeeld daarvan is de klassieke "met of zonder eind "en" (meervoud) situatie waar je een string moet maken die gaat over bv of "1 hond" of "2 honden". Het Engelse voorbeeld gaat over de leeftijd van John Doe die "1 year" of "2 years ( met 's') oud is.
string name = "John Doe";
int age = 42;
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old");
Zie hoe ik een simpel if-then-else statement heb ingebouwd in de string, binnen een aantal 'haakjes'. We kunnen dat doen omdat het resultaat van de expressie een string is, ofwel een lege, ofwel "en". Je kunt ook rekenwerk doen:
Console.WriteLine($"5 + 5 * 2 = {((5 + 5) * 2)}");
Again, as long as the result of the expression can be turned into a string, you can use it within your interpolated string.
String Interpolatie & 'Escaping'
Tamelijk snel nadat je met string interpolatie hebt gewerkt, sta je voor een voor de hand liggende vraag: Hoe kan ik tekens gebruiken die een specifieke betekenis hebben, bv. accolades, en ze toch letterlijk weergeven? Het gebruikelijke antwoord hierop is 'escaping'. Hierbij zet je vóór of achter het teken een ander teken om het speciale doel ervan teniet te doen. Dit klopt ook voor string interpolatie, waar accolades tweemaal zouden moeten worden geschreven, als je wilt dat ze letterlijk worden weergegeven, zoals dit":
Console.WriteLine($"Insert {name} between curly braces: {{name here}}");
The result:
Insert John Doe between curly braces: {name here}
Samenvatting
Als je ooit naar een klassieke string aaneenschakeling hebt gekeken en hem te lomp en onhandig vindt, dan ga je houden van string interpolatie! Dit werd geïntroduceerd in C# versie 6.0 en maakt dat je tekst kunt schrijven waarin variabelen op een heel natuurlijke en gemakkelijk te lezen manier voorkomen. Je kunt er heel gemakkelijk direct expressies mee integreren in strings, maar wees voorzichtig, op een gegeven moment kan jouw geïntegreerde string zo doorontwikkeld zijn dat hij moeilijker te lezen is dan de alternatieven