Interpolace řetězců pomocí $
Znak $
identifikuje řetězcový literál jako interpolovaný řetězec. Interpolovaný řetězec je řetězcový literál, který může obsahovat interpolační výrazy. Když se interpolovaný řetězec přeloží na výsledný řetězec, kompilátor nahradí položky interpolačními výrazy řetězcovými reprezentacemi výsledků výrazu.
Interpolace řetězců poskytuje čitelnější a pohodlnější syntaxi pro formátování řetězců. Čtení je jednodušší než složeného formátování řetězců. Následující příklad používá obě funkce k vytvoření stejného výstupu:
var 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.
Počínaje jazykem C# 10 můžete k inicializaci konstantního řetězce použít interpolovaný řetězec. Můžete to udělat jenom v případě, že všechny interpolační výrazy v interpolovaném řetězci jsou také konstantními řetězci.
Struktura interpolovaného řetězce
Pokud chcete identifikovat řetězcový literál jako interpolovaný řetězec, před něj před něj $
zadejte symbol. Mezi řetězcem a literálem"
, který spouští řetězcový literál, nemůžete mít žádné prázdné znaky$
.
Struktura položky s interpolačním výrazem je následující:
{<interpolationExpression>[,<alignment>][:<formatString>]}
Prvky v hranatých závorkách jsou volitelné. Jednotlivé prvky jsou popsány v následující tabulce:
Element (Prvek) | Popis |
---|---|
interpolationExpression |
Výraz, který vytvoří výsledek, který se má naformátovat. Když je null výraz , výstup je prázdný řetězec (String.Empty). |
alignment |
Konstantní výraz, jehož hodnota definuje minimální počet znaků v řetězcové reprezentaci výsledku výrazu. Je-li kladné, řetězcové vyjádření je zarovnané doprava; pokud je záporná, zarovnaná doleva. Další informace najdete v části Komponenta Zarovnání v článku složené formátování . |
formatString |
Formátovací řetězec podporovaný typem výsledku výrazu. Další informace naleznete v části Formát řetězce součásti složené formátování článku. |
Následující příklad používá volitelné součásti formátování popsané v předchozí tabulce:
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");
// 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# 11 můžete v interpolačním výrazu použít nové řádky, aby byl kód výrazu čitelnější. Následující příklad ukazuje, jak mohou nové řádky zlepšit čitelnost výrazu zahrnujícího porovnávání vzorů:
string message = $"The usage policy for {safetyScore} is {
safetyScore switch
{
> 90 => "Unlimited usage",
> 80 => "General usage, with daily safety check",
> 70 => "Issues must be addressed within 1 week",
> 50 => "Issues must be addressed within 1 day",
_ => "Issues must be addressed before continued use",
}
}";
Interpolované řetězcové literály
Počínaje jazykem C# 11 můžete použít interpolovaný řetězcový literál, jak ukazuje následující příklad:
int X = 2;
int Y = 3;
var pointMessage = $"""The point "{X}, {Y}" is {Math.Sqrt(X * X + Y * Y):F3} from the origin""";
Console.WriteLine(pointMessage);
// Output is:
// The point "2, 3" is 3.606 from the origin
Pokud chcete vložit {
a }
znaky do výsledného řetězce, začněte interpolovaný řetězcový literál s více $
znaky. Když to uděláte, vloží se do výsledného řetězce jakákoli posloupnost {
nebo }
znaky kratší než počet $
znaků. Pokud chcete uzavřít jakýkoli interpolační výraz v tomto řetězci, musíte použít stejný počet složených závorek jako počet $
znaků, jak ukazuje následující příklad:
int X = 2;
int Y = 3;
var pointMessage = $$"""{The point {{{X}}, {{Y}}} is {{Math.Sqrt(X * X + Y * Y):F3}} from the origin}""";
Console.WriteLine(pointMessage);
// Output is:
// {The point {2, 3} is 3.606 from the origin}
V předchozím příkladu interpolovaný řetězcový literál začíná dvěma $
znaky. Každý interpolační výraz musíte umístit mezi dvojité složené závorky ({{
a }}
). Jedna složená závorka se vloží do výsledného řetězce. Pokud potřebujete do výsledného řetězce vložit opakované {
nebo }
znaky, použijte k určení interpolovaného řetězcového literálu odpovídající větší počet $
znaků. Pokud řetězcový literál obsahuje více opakovaných složených závorek než počet $
znaků, {
jsou }
znaky seskupeny z vnitřní strany do vnější strany. V předchozím příkladu literál The point {{{X}}, {{Y}}}
interpretuje {{X}}
a {{Y}}
jako interpolované výrazy. Vnější {
a }
doslovné doslovné doslovné hodnoty ve výstupním řetězci.
Speciální znaky
Chcete-li do textu vytvořeného interpolovaným řetězcem zahrnout složenou závorku {" nebo "}", použijte dvě složené závorky{ nebo "}}". Další informace najdete v části Escaping závorky v článku složené formátování .
Protože dvojtečka (":") má speciální význam v položce interpolačního výrazu, aby bylo možné použít podmíněný operátor ve výrazu interpolace. Uzavřete tento výraz do závorek.
Následující příklad ukazuje, jak zahrnout závorku do výsledného řetězce. Ukazuje také, jak používat 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.");
// Output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.
Interpolovaný doslovný řetězec začíná znaky i $
@
znaky. Můžete použít $
a @
v libovolném pořadí: a $@"..."
@$"..."
jsou platné interpolované doslovné řetězce. Další informace o doslovných řetězcích najdete v článcích s řetězci a doslovnými identifikátory .
Formátování specifické pro jazykovou verzi
Interpolovaný řetězec ve výchozím nastavení používá aktuální jazykovou verzi definovanou CultureInfo.CurrentCulture vlastností pro všechny operace formátování.
Pokud chcete přeložit interpolovaný řetězec na výsledný řetězec specifický pro jazykovou verzi, použijte metodu String.Create(IFormatProvider, DefaultInterpolatedStringHandler) , která je k dispozici počínaje rozhraním .NET 6. Následující příklad ukazuje, jak to udělat:
double speedOfLight = 299792.458;
System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = $"The speed of light is {speedOfLight:N3} km/s.";
var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = string.Create(
specificCulture, $"The speed of light is {speedOfLight:N3} km/s.");
string messageInInvariantCulture = string.Create(
System.Globalization.CultureInfo.InvariantCulture, $"The speed of light is {speedOfLight:N3} km/s.");
Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// 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.
V .NET 5 a starších verzích .NET použijte implicitní převod interpolovaného řetězce na FormattableString instanci. Pak můžete použít metodu instance FormattableString.ToString(IFormatProvider) nebo statickou FormattableString.Invariant metodu k vytvoření výsledného řetězce specifického pro jazykovou verzi. Následující příklad ukazuje, jak to udělat:
double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";
var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);
Console.WriteLine(messageInSpecificCulture);
// Output:
// The speed of light is 2,99,792.458 km/s.
string messageInInvariantCulture = FormattableString.Invariant(message);
Console.WriteLine(messageInInvariantCulture);
// Output is:
// The speed of light is 299,792.458 km/s.
Další informace o vlastním formátování naleznete v části Vlastní formátování pomocí ICustomFormatter typů formátování v článku .NET .
Další prostředky
Pokud s interpolací řetězců začínáte, podívejte se na interpolaci řetězců v interaktivním kurzu jazyka C# . Můžete také zkontrolovat další interpolaci řetězců v kurzu jazyka C# . Tento kurz ukazuje, jak pomocí interpolovaných řetězců vytvořit formátované řetězce.
Kompilace interpolovaných řetězců
Počínaje jazykem C# 10 a .NET 6 kompilátor zkontroluje, jestli je interpolovaný řetězec přiřazen k typu, který splňuje vzor interpolované obslužné rutiny řetězců. Interpolovaná obslužná rutina řetězce je typ, který převede interpolovaný řetězec na výsledný řetězec. Pokud má interpolovaný řetězec typ string
, zpracovává ho System.Runtime.CompilerServices.DefaultInterpolatedStringHandler. Příklad vlastní interpolované řetězcové obslužné rutiny naleznete v kurzu k zápisu vlastní interpolační rutiny řetězců. Použití interpolované obslužné rutiny řetězců je pokročilý scénář, který se obvykle vyžaduje z důvodů výkonu.
Poznámka:
Jedním ze vedlejších účinků interpolovaných obslužných rutin řetězců je, že vlastní obslužná rutina, včetně System.Runtime.CompilerServices.DefaultInterpolatedStringHandler, nesmí vyhodnotit všechny interpolační výrazy v rámci interpolovaného řetězce za všech podmínek. To znamená, že vedlejší účinky těchto výrazů nemusí nastat.
Před C# 10, pokud interpolovaný řetězec má typ string
, je obvykle transformován na String.Format volání metody. Kompilátor může nahradit String.Format String.Concat , pokud by analyzované chování odpovídalo zřetězení.
Pokud má interpolovaný řetězec typ IFormattable nebo FormattableString, kompilátor vygeneruje volání FormattableStringFactory.Create metody.
specifikace jazyka C#
Další informace najdete v části Interpolované řetězcové výrazy specifikace jazyka C# a následující nové specifikace funkcí:
- C# 10 – Vylepšené interpolované řetězce
- C# 11 – nezpracované řetězcové literály
- C# 11 – nové řádky v interpolacích řetězců