Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto kurzu se dozvíte, jak pomocí interpolace řetězců formátovat a zahrnout výsledky výrazu do výsledného řetězce. V příkladech se předpokládá, že znáte základní koncepty jazyka C# a formátování typů .NET. Další informace o formátových typech v .NET naleznete v tématu Typy formátování v .NET.
Úvod
Pokud chcete identifikovat řetězcový literál jako interpolovaný řetězec, zadejte před něj symbol $
. Můžete vložit libovolný platný výraz jazyka C#, který vrátí hodnotu do interpolovaného řetězce. Jakmile se výraz vyhodnotí, v následujícím příkladu se jeho výsledek převede na řetězec a zahrne se do výsledného řetězce:
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
Jak ukazuje příklad, zahrnete výraz do interpolovaného řetězce tak, že ho uzavřete do složených závorek:
{<interpolationExpression>}
Interpolované řetězce podporují všechny možnosti funkce složeného formátování řetězců . Díky tomu jsou čitelnější alternativou k použití String.Format metody. Každý interpolovaný řetězec musí mít:
- Řetězcový literál, který začíná znakem
$
před svým počátečním uvozovacím znakem. Mezi symbolem a znakem uvozovky nesmí být mezery$
. - Jeden nebo více interpolačních výrazů Označujete interpolační výraz otevřenou a uzavřenou složenou závorkou (
{
a}
). Do složených závorek můžete vložit libovolný výraz jazyka C#, který vrátí hodnotu (včetněnull
).
Jazyk C# vyhodnocuje výraz mezi znaky {
a }
podle následujících pravidel:
- Pokud se interpolační výraz vyhodnotí jako
null
, použije se prázdný řetězec ("", nebo String.Empty). - Pokud se interpolační výraz nevyhodnocuje jako
null
, obvykle se volá metodaToString
typu výsledku.
Jak zadat formátovací řetězec pro interpolační výraz
Pokud chcete zadat formátovací řetězec podporovaný typem výsledku výrazu, postupujte podle interpolačního výrazu s dvojtečku (":") a formátovacím řetězcem:
{<interpolationExpression>:<formatString>}
Následující příklad ukazuje, jak zadat standardní a vlastní formátovací řetězce pro výrazy, které vytvářejí datum a čas nebo číselné výsledky:
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.
Další informace naleznete v části Komponenta formátovacího řetězce článku o složeném formátování.
Jak řídit šířku pole a zarovnání formátovaného interpolačního výrazu
Pokud chcete zadat minimální šířku pole a zarovnání výsledku formátovaného výrazu, za interpolačním výrazem pokračujte čárkou (",") a konstantním výrazem:
{<interpolationExpression>,<width>}
Následující ukázka kódu používá k vytvoření tabulkového výstupu minimální šířku pole:
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 |
Pokud je hodnota šířky kladná, výsledek formátovaného výrazu je zarovnaný doprava; pokud je záporná, je zarovnaná doleva.
-
Odeberte znaménka před specifikátorem šířky a spusťte ukázku znovu, abyste viděli výsledky.
Pokud potřebujete zadat šířku i formátovací řetězec, začněte komponentou width:
{<interpolationExpression>,<width>:<formatString>}
Následující příklad ukazuje, jak zadat šířku a zarovnání a pomocí znaků svislé čáry (|) oddělovat textová pole:
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|
Jak ukazuje příklad výstupu, pokud délka výsledku formátovaného výrazu překročí zadanou šířku pole, hodnota šířky se ignoruje.
Další informace naleznete v části Součásti Width v článku složeného formátování .
Jak používat únikové sekvence v interpolovaném řetězci
Interpolované řetězce podporují všechny řídicí sekvence, které lze použít v obyčejných řetězcových literálech. Další informace naleznete v tématu Escape sekvence řetězců.
Chcete-li interpretovat escape sekvence doslova, použijte doslovný literál řetězce. Interpolovaný doslovný řetězec začíná znaky $
a @
. Můžete použít $
a @
v libovolném pořadí: a $@"..."
@$"..."
jsou platné interpolované doslovné řetězce.
Chcete-li do výsledného řetězce zahrnout složenou závorku „{“ nebo „}“, použijte dvě složené závorky „{{“ nebo „}}“. Další informace najdete v části Escape sekvence pro závorky v článku Složené Formátování.
Následující příklad ukazuje, jak zahrnout složené závorky do výsledného řetězce a vytvořit doslovný interpolovaný řetězec:
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
Počínaje jazykem C# 11 můžete použít interpolované řetězcové literály.
Použití ternárního podmíněného operátoru ?:
ve výrazu interpolace
Protože dvojtečka (":") má speciální význam v položce s interpolačním výrazem, aby bylo možné použít podmíněný operátor ve výrazu, uzavřete ho do závorek, jak ukazuje následující příklad:
var rand = new Random();
for (int i = 0; i < 7; i++)
{
Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}
Jak vytvořit výsledný řetězec přizpůsobený kulturnímu kontextu pomocí interpolace řetězců
Interpolovaný řetězec ve výchozím nastavení používá aktuální jazykovou kulturu definovanou CultureInfo.CurrentCulture vlastností pro všechny operace formátování.
Počínaje rozhraním .NET 6 můžete metodu String.Create(IFormatProvider, DefaultInterpolatedStringHandler) použít k překladu interpolovaného řetězce na výsledný řetězec specifický pro jazykovou verzi, jak ukazuje následující příklad:
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
V dřívějších verzích rozhraní .NET použijte implicitní převod interpolovaného řetězce na System.FormattableString instanci a zavolejte jeho ToString(IFormatProvider) metodu k vytvoření výsledného řetězce specifického pro jazykovou verzi. Následující příklad ukazuje, jak to udělat:
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
Jak ukazuje příklad, můžete použít jednu FormattableString instanci k vygenerování více výsledných řetězců pro různé kultury.
Jak vytvořit výsledný řetězec pomocí invariantní jazykové verze
Počínaje rozhraním .NET 6, použijte metodu String.Create(IFormatProvider, DefaultInterpolatedStringHandler) k převodu interpolovaného řetězce na výsledný řetězec pro InvariantCulture, jak ukazuje následující příklad:
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
V dřívějších verzích rozhraní .NET spolu s metodou FormattableString.ToString(IFormatProvider) můžete použít statickou FormattableString.Invariant metodu, jak ukazuje následující příklad:
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
Závěr
Tento kurz popisuje běžné scénáře použití interpolace řetězců. Další informace o interpolaci řetězců naleznete v tématu Interpolace řetězců. Další informace o typech formátování v .NET naleznete v článcích o formátování v .NET a složeného formátování .