Sdílet prostřednictvím


Interpolace řetězců v jazyce C#

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á metoda ToString 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í .

Viz také