Share via


Tekenreeksinterpolatie in C#

In deze zelfstudie leert u hoe u tekenreeksinterpolatie gebruikt om expressieresultaten op te maken en op te nemen in een resultaattekenreeks. In de voorbeelden wordt ervan uitgegaan dat u bekend bent met basisconcepten van C# en .NET-typeopmaak. Als u geen kennis hebt van tekenreeksinterpolatie of .NET-typeopmaak, raadpleegt u eerst de interactieve zelfstudie voor tekenreeksinterpolatie. Zie Opmaaktypen in .NET voor meer informatie over opmaaktypen in . NET.

Inleiding

Als u een letterlijke tekenreeks wilt identificeren als een geïnterpoleerde tekenreeks, wordt deze voorafgegaan door het $ symbool. U kunt elke geldige C#-expressie insluiten die een waarde retourneert in een geïnterpoleerde tekenreeks. Zodra een expressie wordt geëvalueerd, wordt het resultaat in het volgende voorbeeld geconverteerd naar een tekenreeks en opgenomen in een resultaattekenreeks:

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);
// Output:
// 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

Zoals in het voorbeeld wordt weergegeven, neemt u een expressie op in een geïnterpoleerde tekenreeks door deze tussen accolades te zetten:

{<interpolationExpression>}

Geïnterpoleerde tekenreeksen ondersteunen alle mogelijkheden van de functie voor samengestelde tekenreeksen . Dit maakt ze een beter leesbaar alternatief voor het gebruik van de String.Format methode.

Een notatietekenreeks opgeven voor een interpolatie-expressie

Als u een notatietekenreeks wilt opgeven die wordt ondersteund door het type expressieresultaat, volgt u de interpolatie-expressie met een dubbele punt (:) en de notatietekenreeks:

{<interpolationExpression>:<formatString>}

In het volgende voorbeeld ziet u hoe u tekenreeksen voor standaard- en aangepaste notatie opgeeft voor expressies die datum- en tijd- of numerieke resultaten produceren:

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}.");
// Output:
// On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.

Zie de sectie Opmaaktekenreeksonderdeel van het artikel Samengestelde opmaak voor meer informatie.

De veldbreedte en uitlijning van de opgemaakte interpolatie-expressie bepalen

Als u de minimale veldbreedte en de uitlijning van het opgemaakte expressieresultaat wilt opgeven, volgt u de interpolatie-expressie met een komma (",") en de constante expressie:

{<interpolationExpression>,<alignment>}

Als de uitlijningswaarde positief is, wordt het resultaat van de opgemaakte expressie rechts uitgelijnd. Als dit negatief is, wordt deze links uitgelijnd.

Als u zowel uitlijning als een opmaaktekenreeks wilt opgeven, begint u met het uitlijningsonderdeel:

{<interpolationExpression>,<alignment>:<formatString>}

In het volgende voorbeeld ziet u hoe u uitlijning opgeeft en sluistekens (|) gebruikt om tekstvelden te scheiden:

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}|");
// Output:
// Three classical Pythagorean means of 3 and 4:
// |Arithmetic|  3.500|
// |Geometric|  3.464|
// |Harmonic |  3.429|

Zoals in de voorbeelduitvoer wordt weergegeven, wordt de uitlijningswaarde genegeerd als de lengte van het opgemaakte expressieresultaat de opgegeven veldbreedte overschrijdt.

Zie de sectie Uitlijning van het artikel Samengestelde opmaak voor meer informatie.

Escape-reeksen gebruiken in een geïnterpoleerde tekenreeks

Geïnterpoleerde tekenreeksen ondersteunen alle escapereeksen die kunnen worden gebruikt in gewone letterlijke tekenreeksen. Zie Escapereeksen voor tekenreeksen voor meer informatie.

Als u escapereeksen letterlijk wilt interpreteren, gebruikt u een letterlijke letterlijke tekenreeks . Een geïnterpoleerde verbatimtekenreeks begint met de beide $ tekens en @ tekens. U kunt en @ in elke willekeurige volgorde gebruiken$: beide $@"..." en @$"..." zijn geldige, geïnterpoleerde verbatimtekenreeksen.

Als u een accolade, {of }, wilt opnemen in een resultaattekenreeks, gebruikt u twee accolades: {{of }}. Zie de sectie Escape-accolades van het artikel Samengestelde opmaak voor meer informatie.

In het volgende voorbeeld ziet u hoe u accolades in een resultaattekenreeks opneemt en een letterlijk geïnterpoleerde tekenreeks maakt:

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

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

Vanaf C# 11 kunt u geïnterpoleerde letterlijke tekenreeksen gebruiken.

Een ternaire voorwaardelijke operator ?: gebruiken in een interpolatie-expressie

Als de dubbele punt (':') een speciale betekenis heeft in een item met een interpolatie-expressie, om een voorwaardelijke operator in een expressie te gebruiken, plaatst u deze tussen haakjes, zoals in het volgende voorbeeld wordt weergegeven:

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

Een cultuurspecifieke resultaattekenreeks maken met tekenreeksinterpolatie

Standaard maakt een geïnterpoleerde tekenreeks gebruik van de huidige cultuur die door de CultureInfo.CurrentCulture eigenschap is gedefinieerd voor alle opmaakbewerkingen.

Vanaf .NET 6 kunt u de String.Create(IFormatProvider, DefaultInterpolatedStringHandler) methode gebruiken om een geïnterpoleerde tekenreeks om te zetten in een cultuurspecifieke resultaattekenreeks, zoals in het volgende voorbeeld wordt weergegeven:

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
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       8/27/2023 12:35:31 PM      31,415,926.536
// en-GB         27/08/2023 12:35:31      31,415,926.536
// nl-NL         27-08-2023 12:35:31      31.415.926,536
//               08/27/2023 12:35:31      31,415,926.536

In eerdere versies van .NET gebruikt u impliciete conversie van een geïnterpoleerde tekenreeks naar een System.FormattableString exemplaar en roept u de methode aan ToString(IFormatProvider) om een cultuurspecifieke resultaattekenreeks te maken. In het volgende voorbeeld ziet u hoe u dit doet:

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
FormattableString message = $"{date,23}{number,20:N3}";
foreach (var culture in cultures)
{
    var cultureSpecificMessage = message.ToString(culture);
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// en-US       8/27/2023 12:35:31 PM      31,415,926.536
// en-GB         27/08/2023 12:35:31      31,415,926.536
// nl-NL         27-08-2023 12:35:31      31.415.926,536
//               08/27/2023 12:35:31      31,415,926.536

Zoals in het voorbeeld wordt weergegeven, kunt u één FormattableString exemplaar gebruiken om meerdere resultaattekenreeksen voor verschillende culturen te genereren.

Een resultaattekenreeks maken met behulp van de invariante cultuur

Gebruik vanaf .NET 6 de String.Create(IFormatProvider, DefaultInterpolatedStringHandler) methode om een geïnterpoleerde tekenreeks om te zetten in een resultaattekenreeks voor de InvariantCulturetekenreeks, zoals in het volgende voorbeeld wordt weergegeven:

string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24

In eerdere versies van .NET, samen met de FormattableString.ToString(IFormatProvider) methode, kunt u de statische FormattableString.Invariant methode gebruiken, zoals in het volgende voorbeeld wordt weergegeven:

string message = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24

Conclusie

In deze zelfstudie worden veelvoorkomende scenario's beschreven van het gebruik van tekenreeksinterpolatie. Zie Tekenreeksinterpolatie voor meer informatie over tekenreeksinterpolatie. Zie de opmaaktypen in .NET en samengestelde opmaakartikelen voor meer informatie over opmaaktypen in .NET.

Zie ook