$-Řetězcová interpolace (Referenční dokumentace jazyka C#)

$Speciální znak identifikuje řetězcový literál jako interpolovaná řetězec. Interpolovaná řetězcová konstanta je řetězcový literál, který může obsahovat výrazy interpolace. Když je interpolovaná řetězcová událost přeložena na výsledný řetězec, položky s výrazy interpolace jsou nahrazeny řetězcovými reprezentacemi výsledků výrazu. Tato funkce je k dispozici počínaje verzí C# 6.

Interpolace řetězců poskytuje čitelnější a pohodlný Syntax pro formátování řetězců. Čtení je snazší než formátování složené z řetězců. Porovnejte následující příklad, který používá obě funkce k produkci stejného výstupu:

string name = "Mark";
var date = DateTime.Now;

// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

Struktura interpolované řetězce

Pro identifikaci řetězcového literálu jako interpolované řetězce, předřaďte ho $ symbolem. Mezi znakem $ a " , který začíná řetězcovým literálem, nelze zadat prázdný znak.

Struktura položky s výraz interpolace je následující:

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

Prvky v hranatých závorkách jsou volitelné. V následující tabulce jsou popsány jednotlivé prvky:

Element Popis
interpolationExpression Výraz, který generuje výsledek, který má být formátován. Řetězcová reprezentace null je String.Empty .
alignment Konstantní výraz, jehož hodnota určuje minimální počet znaků v řetězcové reprezentaci výsledku výrazu. Je-li kladné, Řetězcová reprezentace je zarovnána doprava; Pokud je záporná, zůstane zarovnaná doleva. Další informace najdete v tématu součást zarovnání.
formatString Řetězec formátu, který je podporován typem výsledku výrazu. Další informace naleznete v tématu formátovací řetězec – komponenta.

Následující příklad používá volitelné formátovací komponenty popsané výše:

Console.WriteLine($"|{"Left",-7}|{"Right",7}|");

const int FieldWidthRightAligned = 20;
Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - default formatting of the pi number");
Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F3} - display only three decimal digits of the pi number");
// Expected output is:
// |Left   |  Right|
//     3.14159265358979 - default formatting of the pi number
//                3.142 - display only three decimal digits of the pi number

Počínaje jazykem C# 10 můžete použít interpolaci řetězce k inicializaci konstantního řetězce. Všechny výrazy používané pro zástupné symboly musí být konstantní řetězce. Jinými slovy, každý výraz interpolace musí být řetězec a musí se jednat o časovou konstantu kompilace.

Speciální znaky

Chcete-li do textu vytvořeného interpolované řetězce zahrnout složené závorky "{" nebo "}", použijte dvě složené závorky "{{" nebo "}}". Další informace naleznete v tématu uvozovací závorky.

Jako dvojtečka (":") má zvláštní význam v položce výrazu interpolace, aby bylo možné použít podmíněný operátor ve výrazu interpolace, uzavřít tento výraz do závorek.

Následující příklad ukazuje, jak zahrnout složenou závorku ve výsledném řetězci. Ukazuje také, jak použít podmíněný operátor:

string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
// Expected output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.

Interpolované doslovné řetězce začíná $ znakem následovaným @ znakem. Další informace o doslovnéch řetězcích naleznete v článcích String a doslovného identifikátoru .

Poznámka

Počínaje jazykem C# 8,0 můžete použít $ @ tokeny a v libovolném pořadí: $@"..." a @$"..." jsou platné interpolované řetězce. V dřívějších verzích C# se $ token musí vyskytovat před @ tokenem.

Implicitní převody a určení IFormatProvider implementace

Existují tři implicitní převody z interpolované řetězce:

  1. Převod interpolované řetězcové String instance na instanci. Řetězec je výsledkem interpolované řetězcové rozlišení. Všechny položky výrazu interpolace jsou nahrazeny správně formátovanými řetězcovými reprezentacemi jejich výsledků. Tento převod používá CurrentCulture k formátování výsledků výrazu.

  2. Převod interpolované řetězcové na FormattableString instanci, která představuje složený řetězec formátu společně s výsledky výrazu, který má být formátován. To umožňuje vytvořit více výsledných řetězců s obsahem specifickým pro jazykovou verzi z jedné FormattableString instance. Chcete-li to provést, zavolejte jednu z následujících metod:

    ToString(IFormatProvider)Poskytuje uživatelsky definovanou implementaci IFormatProvider rozhraní, které podporuje vlastní formátování. Další informace naleznete v části vlastní formátování pomocí ICustomFormatter oddílu typy formátování v článku .NET .

  3. Převod interpolované řetězce na IFormattable instanci, která také umožňuje vytvořit více výsledných řetězců s obsahem specifickým pro jazykovou verzi z jedné IFormattable instance.

Následující příklad používá implicitní převod na FormattableString k vytvoření řetězců výsledků specifických pro jazykovou verzi:

double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);

string messageInInvariantCulture = FormattableString.Invariant(message);

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected output is:
// nl-NL      The speed of light is 299.792,458 km/s.
// en-IN      The speed of light is 2,99,792.458 km/s.
// Invariant  The speed of light is 299,792.458 km/s.

Další zdroje informací

Pokud s interpolací řetězce začínáte, přečtěte si část o interpolaci řetězců v interaktivním kurzu C#. V kurzu jazyka C# můžete také ověřit jinou interpolaci řetězce . Tento kurz ukazuje, jak použít interpolované řetězce pro vytvoření formátovaných řetězců.

Kompilace interpolovaná řetězce

Pokud má interpolující řetězec typ, je string obvykle transformovaná na String.Format volání metody. Kompilátor může nahradit String.Format , String.Concat Pokud bylo analyzované chování ekvivalentní zřetězení.

Pokud má interpolující řetězec typ IFormattable nebo FormattableString , kompilátor vygeneruje volání FormattableStringFactory.Create metody.

Počínaje jazykem C# 10, při použití interpolované řetězce, kompilátor zkontroluje, zda je interpolovaná řetězcová událost přiřazena typu, který splňuje vzorek interpolované řetězcové obslužné rutiny. Interpolovaná řetězcová obslužná rutina je vlastní typ, který převede interpolovaná řetězec na řetězec. Rutina interpolovaná řetězcové události je pokročilý scénář, který se obvykle používá z důvodů výkonu. Můžete získat informace o požadavcích na sestavení interpolované řetězcové obslužné rutiny ve specifikaci jazyka pro interpolovaná řetězcová vylepšení. V části novinky v jazyce C# můžete vytvořit jeden z kurzů interpolovaná řetězcová obslužná rutina . V rozhraní .NET 6 při použití interpolované řetězce pro argument typu string je interpolovaná řetězec zpracován pomocí System.Runtime.CompilerServices.DefaultInterpolatedStringHandler .

Poznámka

Jedním z vedlejších účinků interpolované obslužné rutiny řetězce je, že vlastní obslužná rutina, včetně System.Runtime.CompilerServices.DefaultInterpolatedStringHandler , nesmí vyhodnotit všechny výrazy, které se používají jako zástupné symboly v interpolované řetězci za všech podmínek. To znamená, že v těchto výrazech neproběhne vedlejší účinky.

specifikace jazyka C#

Další informace naleznete v části interpolované řetězce v tématu specifikace jazyka C#.

Viz také