Tekenreeksinterpolatie in C#

Aanbeveling

Dit artikel maakt deel uit van de sectie Grondbeginselen voor ontwikkelaars die al ten minste één programmeertaal kennen en C# leren. Als u nieuw bent in programmeren, begint u eerst met de Aan de slag-handleidingen.

Komt u uit een andere taal? Tekenreeksinterpolatie in C# werkt ongeveer hetzelfde als template literals in JavaScript (`${x}`) of f-strings in Python (f"{x}"). De expressie binnen {} kan elke geldige C#-expressie zijn en u kunt opmaak- en uitlijningsaanduidingen toevoegen zonder de tekenreeks te verlaten.

Met tekenreeksinterpolatie kunt u expressies rechtstreeks insluiten in een letterlijke tekenreeks door het letterlijke voorvoegsel te voorzien van $:

double a = 3;
double b = 4;
Console.WriteLine($"Area of the right triangle with legs of {a} and {b} is {0.5 * a * b}");
Console.WriteLine($"Length of the hypotenuse of the right triangle with legs of {a} and {b} is {CalculateHypotenuse(a, b)}");
double CalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);
// => Area of the right triangle with legs of 3 and 4 is 6
// => Length of the hypotenuse of the right triangle with legs of 3 and 4 is 5

Elk { } is een interpolatie-expressie. C# evalueert de expressie, converteert het resultaat naar een tekenreeks door de ToString() methode aan te roepen en vervangt de tekst in het resultaat. De tekenreeksinterpolatie voor een null expressie is de lege tekenreeks. In de meeste gevallen produceert de standaardconversie de gewenste uitvoer en hoeft u niets meer te doen.

Geïnterpoleerde tekenreeksen zijn een beter leesbaar alternatief voor String.Format, en ze ondersteunen de volledige functieset voor samengestelde opmaak . Alles wat u kunt doen met een tekenreeks met een klassieke positionele notatie, opmaakaanduidingen, uitlijning, cultuurbewuste opmaak en constante tekenreeksen, kunt u ook doen met een geïnterpoleerde tekenreeks. In de rest van dit artikel worden deze opties behandeld. Bereik ze alleen als u meer controle over het resultaat nodig hebt; anders is het gewone $"{expression}" formulier voldoende.

Zie de geïnterpoleerde tekenreeksverwijzing voor de taalverwijzing van de syntaxis en de onderliggende handlertypen. Zie Span<char> voor onderwerpen met betrekking tot prestaties, zoals interpolatie en aangepaste geïnterpoleerde tekenreekshandlers.

Een opmaaktekenreeks toepassen

Als u wilt bepalen hoe een expressieresultaat is opgemaakt, volgt u de expressie met een dubbele punt en een standaard- of aangepaste notatietekenreeks:

{<expression>:<formatString>}

In het volgende voorbeeld worden een DateTime en een Double waarde opgemaakt:

var date = new DateTime(1731, 11, 25);
Console.WriteLine($"On {date:dddd, MMMM dd, yyyy} L. Euler introduced the letter e to denote {Math.E:F5}.");
// => On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.

De veldbreedte en -uitlijning instellen

Als u uitgelijnde uitvoer wilt produceren, volgt u de expressie met een komma en een minimale veldbreedte. Positieve breedten rechts uitlijnen van de waarde en negatieve breedten links uitlijnen:

{<expression>,<width>}
var titles = new Dictionary<string, string>()
{
    ["Doyle, Arthur Conan"] = "Hound of the Baskervilles, The",
    ["London, Jack"] = "Call of the Wild, The",
    ["Shakespeare, William"] = "Tempest, The"
};

Console.WriteLine("Author and Title List");
Console.WriteLine();
Console.WriteLine($"|{"Author",-25}|{"Title",30}|");
foreach (var title in titles)
{
    Console.WriteLine($"|{title.Key,-25}|{title.Value,30}|");
}
// => Author and Title List
// =>
// => |Author                   |                         Title|
// => |Doyle, Arthur Conan      |Hound of the Baskervilles, The|
// => |London, Jack             |         Call of the Wild, The|
// => |Shakespeare, William     |                  Tempest, The|

Als u zowel uitlijning als een opmaaktekenreeks nodig hebt, plaatst u de uitlijning eerst:

{<expression>,<width>:<formatString>}
const int NameAlignment = -9;
const int ValueAlignment = 7;
double a = 3;
double b = 4;
Console.WriteLine($"Three classical Pythagorean means of {a} and {b}:");
Console.WriteLine($"|{"Arithmetic",NameAlignment}|{0.5 * (a + b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Geometric",NameAlignment}|{Math.Sqrt(a * b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Harmonic",NameAlignment}|{2 / (1 / a + 1 / b),ValueAlignment:F3}|");
// => Three classical Pythagorean means of 3 and 4:
// => |Arithmetic|  3.500|
// => |Geometric|  3.464|
// => |Harmonic |  3.429|

Als de opgemaakte waarde langer is dan de aangevraagde breedte, negeert C# de breedte en verzendt de volledige waarde.

Escape-accolades en escapereeksen gebruiken

Geïnterpoleerde tekenreeksen ondersteunen dezelfde escapereeksen als gewone letterlijke tekenreeksen. Als u een letterlijk {- of }-teken in het resultaat wilt opnemen, verdubbel het dan ({{ of }}).

Voor paden en andere tekenreeksen die backslashes bevatten, geeft u de voorkeur aan een geïnterpoleerde letterlijke tekenreeks ($"""...""") boven het oudere verbatimformulier ($@"..."). Ruwe tekenreeksliteralen interpreteren geen escapesequenties, dus backslashes worden letterlijk weergegeven:

int[] xs = [1, 2, 7, 9];
int[] ys = [7, 9, 12];
Console.WriteLine($"Find the intersection of the {{{string.Join(", ", xs)}}} and {{{string.Join(", ", ys)}}} sets.");
// => Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.

var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var rawInterpolated = $"""C:\Users\{userName}\Documents""";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(rawInterpolated);
// => C:\Users\Jane\Documents
// => C:\Users\Jane\Documents

Een voorwaardelijke expressie gebruiken

De dubbele punt heeft een speciale betekenis in een interpolatie-expressie, dus plaats een voorwaardelijke expressie tussen haakjes:

var rand = new Random(42);
for (int i = 0; i < 3; i++)
{
    Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}

Een expressie over meerdere regels spannen

Voor een betere leesbaarheid kunt u lange interpolatie-expressies over meerdere regels verbreken. Expressies voor interpolatie met meerdere regels zijn beschikbaar sinds C# 11. In het volgende voorbeeld worden nieuwe regels tussen de { en } tekens toegevoegd om de geïnterpoleerde expressies van de letterlijke tekst te scheiden:

int[] numbers = [3, 1, 4, 1, 5, 9, 2, 6];
Console.WriteLine($"Total: {
        numbers.Sum()
        }, average: {numbers.Average():F2}.");
// => Total: 31, average: 3.88.

Constante tekenreeksen bouwen

U kunt constant geïnterpoleerde tekenreeksen bouwen wanneer elke geïnterpoleerde expressie een constante waarde is. Dit maakt het bruikbaar voor kenmerkargumenten, switch patronen en andere contexten waarvoor compilatieconstanten nodig zijn:

const string Audience = "world";
const string Greeting = $"Hello, {Audience}!";
Console.WriteLine(Greeting);
// => Hello, world!

Opmaak met een specifieke cultuur

Standaard worden waarden in een geïnterpoleerde tekenreeks opgemaakt met CultureInfo.CurrentCulture, wat van invloed is op de weergave van datums, getallen en valuta. Geef voor deterministische uitvoer een expliciete cultuur door aan String.Create(IFormatProvider, DefaultInterpolatedStringHandler):

CultureInfo[] cultures =
[
    CultureInfo.GetCultureInfo("en-US"),
    CultureInfo.GetCultureInfo("en-GB"),
    CultureInfo.GetCultureInfo("nl-NL"),
    CultureInfo.InvariantCulture
];
var date = new DateTime(2026, 5, 21, 12, 35, 31);
var number = 31_415_926.536;
foreach (var culture in cultures)
{
    var cultureSpecificMessage = string.Create(culture, $"{date,23}{number,20:N3}");
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// => en-US       5/21/2026 12:35:31 PM      31,415,926.536
// => en-GB         21/05/2026 12:35:31      31,415,926.536
// => nl-NL         21-05-2026 12:35:31      31.415.926,536
// =>               05/21/2026 12:35:31      31,415,926.536

Voor invariante uitvoer (logboeken, bestandsindelingen, machineleesbare gegevens), geeft u CultureInfo.InvariantCulturehet volgende door:

var timestamp = new DateTime(2026, 5, 21, 15, 46, 24);
string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {timestamp}");
Console.WriteLine(message);
// => Date and time in invariant culture: 05/21/2026 15:46:24

Zie ook