Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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. Zie Opmaaktypen in .NET voor meer informatie over opmaaktypen in .NET.
Introductie
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. Elke geïnterpoleerde tekenreeks moet het volgende hebben:
- Een letterlijke tekenreeks die begint met het
$
-teken vóór het openingsaanhalingsteken. Er kunnen geen spaties zijn tussen het$
symbool en het aanhalingsteken. - Een of meer interpolatie-expressies. U geeft een interpolatie aan met een openende en sluitende accolade (
{
en}
). U kunt elke C#-expressie die een waarde retourneert (inclusiefnull
) binnen de accolades plaatsen.
C# evalueert de expressie tussen de {
en }
tekens met de volgende regels:
- Als de interpolatie-expressie resulteert in
null
een lege tekenreeks ("", of String.Empty) wordt gebruikt. - Als de interpolatie-expressie niet evalueert tot
null
, wordt meestal deToString
methode van het resultaattype aangeroepen.
Een notatietekenreeks opgeven voor een interpolatie-expressie
Als u een formaattekenreeks wilt opgeven die wordt ondersteund door het type van het expressieresultaat, plaatst u een dubbele punt (:) direct na de interpolatie-expressie, gevolgd door de formaattekenreeks.
{<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>,<width>}
In het volgende codevoorbeeld wordt de minimale veldbreedte gebruikt om een tabellaire uitvoer te maken:
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}|");
}
// Output:
// 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 de breedtewaarde positief is, wordt het resultaat van de opgemaakte expressie rechts uitgelijnd; als dit negatief is, wordt deze links uitgelijnd. Verwijder de -
tekens vóór de breedteaanduiding en voer het voorbeeld opnieuw uit om de resultaten te zien.
Als u zowel de breedte als een notatietekenreeks wilt opgeven, begint u met het onderdeel Breedte:
{<interpolationExpression>,<width>:<formatString>}
In het volgende voorbeeld ziet u hoe u breedte en 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 breedtewaarde genegeerd als de lengte van het opgemaakte expressieresultaat de opgegeven veldbreedte overschrijdt.
Voor meer informatie, zie de sectie Breedte van het artikel Samengestelde opmaak.
Hoe escape-reeksen te gebruiken in een geïnterpoleerde tekst
Geïnterpoleerde tekenreeksen ondersteunen alle escapesequenties die kunnen worden gebruikt in gewone tekenreeksen. Zie Tekenreeksen escape-sequenties voor meer informatie.
Als u escapereeksen letterlijk wilt interpreteren, gebruikt u een letterlijke tekenreeks. Een geïnterpoleerde letterlijke tekenreeks begint met zowel de $
- als de @
-tekens. U kunt $
en @
in elke willekeurige volgorde gebruiken: beide $@"..."
en @$"..."
zijn geldige, geïnterpoleerde verbatim-tekenreeksen.
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 kunt opnemen in een resultaattekenreeks en hoe u een letterlijk geïnterpoleerde tekenreeks kunt maken.
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 gebruikt een geïnterpoleerde tekenreeks de huidige cultuur, zoals gedefinieerd door de CultureInfo.CurrentCulture-eigenschap, 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 resultaatstring 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 handleiding 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.