Sztring interpolációja C-ben#

Jótanács

Ez a cikk az Alapismeretek szakasz része azon fejlesztők számára, akik már legalább egy programozási nyelvet ismernek, és c#-t tanulnak. Ha még csak most ismerkedik a programozással, először az Első lépések oktatóanyagokkal kezdje.

Más nyelvről jön? A C#-beli sztringinterpoláció nagyjából úgy működik, mint a JavaScript sablonliteráljai (`${x}`) vagy a Python f-sztringjei (f"{x}"). A benne lévő {} kifejezés bármilyen érvényes C#-kifejezés lehet, és a sztring elhagyása nélkül adhat hozzá formátum- és igazítási meghatározókat.

A sztringinterpoláció lehetővé teszi, hogy a kifejezéseket közvetlenül egy sztringliterálba ágyazza be úgy, hogy a literált a $ előtaggal látja el:

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);
// => 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

Mindegyik { } egy interpolációs kifejezés. A C# kiértékeli a kifejezést, sztringgé alakítja az eredményt a metódus meghívásával ToString() , és a szöveget az eredményre cseréli. Egy null kifejezés karakterlánc-interpolációja az üres karakterlánc. A legtöbb esetben az alapértelmezett átalakítás hozza létre a kívánt kimenetet, és nincs szükség további műveletekre.

Az interpolált sztringek a String.Format olvashatóbb alternatívái, és támogatják a összetett formázás teljes funkciókészletét. A klasszikus pozícióformátumú sztringekkel – formátumjelölőkkel, igazítással, kultúraérzékeny formázással és állandó sztringekkel – bármilyen műveletet elvégezhet egy interpolált sztringgel is. A cikk további része ezeket a lehetőségeket ismerteti. Csak akkor érheti el őket, ha finomabb ellenőrzésre van szüksége az eredmény felett; ellenkező esetben az egyszerű $"{expression}" forma elegendő.

A szintaxis és a mögöttes kezelőtípusok nyelvi referenciakezeléséhez lásd az interpolált sztringhivatkozást . A teljesítményközpontú témakörökről, például Span<char> az interpolációról és az egyéni interpolált sztringkezelőkről a Sztringműveletek című témakörben olvashat.

Formátumkarakterlánc alkalmazása

A kifejezés eredményének formázásának szabályozásához a kifejezést kettősponttal és egy szabványos vagy egyéni formátumkarakterlánccal kövesse:

{<expression>:<formatString>}

Az alábbi példa egy DateTime és egy Double értéket formáz:

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}.");
// => On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.

A mező szélességének és igazításának beállítása

Igazított kimenet létrehozásához kövesse a kifejezést vesszővel és minimális mezőszélességgel. A pozitív szélességek jobbra igazítják az értéket, a negatív szélességek pedig balra igazítják:

{<expression>,<width>}
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}|");
}
// => 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|

Ha igazításra és formátumsztringre is szüksége van, helyezze az igazítást az első helyre:

{<expression>,<width>:<formatString>}
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}|");
// => Three classical Pythagorean means of 3 and 4:
// => |Arithmetic|  3.500|
// => |Geometric|  3.464|
// => |Harmonic |  3.429|

Ha a formázott érték hosszabb a kért szélességnél, a C# figyelmen kívül hagyja a szélességet, és a teljes értéket bocsátja ki.

Escape kapcsos zárójelek és a menekülési sorozatok használata

Az interpolált sztringek ugyanazokat a feloldósorozatokat támogatják, mint a hagyományos sztringkonstansok. Ha egy szó szerinti { vagy } karaktert szeretne szerepeltetni az eredményben, duplázza meg ({{ vagy }}).

Azoknál az elérési utaknál és egyéb, fordított törtjelet tartalmazó sztringeknél inkább az interpolált nyers sztringliterált ($"""...""") használja a régebbi verbatim forma ($@"...") helyett. A nyers karakterlánc-literálok nem dolgozzák fel az escape-szekvenciákat, ezért a fordított perjelek változatlanul jelennek meg:

int[] xs = [1, 2, 7, 9];
int[] ys = [7, 9, 12];
Console.WriteLine($"Find the intersection of the {{{string.Join(", ", xs)}}} and {{{string.Join(", ", ys)}}} sets.");
// => Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.

var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var rawInterpolated = $"""C:\Users\{userName}\Documents""";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(rawInterpolated);
// => C:\Users\Jane\Documents
// => C:\Users\Jane\Documents

Feltételes kifejezés használata

A kettőspont speciális jelentéssel bír egy interpolációs kifejezésen belül, ezért tegye zárójelbe a feltételes kifejezést:

var rand = new Random(42);
for (int i = 0; i < 3; i++)
{
    Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}

Kifejezés több sorra kiterjesztése

A jobb olvashatóság érdekében több sorban megszakíthatja a hosszú interpolációs kifejezéseket. A C# 11 óta többsoros interpolációs kifejezések érhetők el. Az alábbi példa sortöréseket szúr be a { és } karakterek közé, hogy elkülönítse az interpolált kifejezéseket a literális szövegtől:

int[] numbers = [3, 1, 4, 1, 5, 9, 2, 6];
Console.WriteLine($"Total: {
        numbers.Sum()
        }, average: {numbers.Average():F2}.");
// => Total: 31, average: 3.88.

Állandó sztringek létrehozása

Konstans interpolált sztringeket akkor hozhat létre, ha minden interpolált kifejezés állandó érték. Így használható attribútumargumentumokhoz, switch mintákhoz és más olyan környezetekhez, amelyek fordítási időállandókat igényelnek:

const string Audience = "world";
const string Greeting = $"Hello, {Audience}!";
Console.WriteLine(Greeting);
// => Hello, world!

Formátum egy adott kultúrával

Alapértelmezés szerint egy interpolált sztring a CultureInfo.CurrentCulture használatával formázza az értékeket, ami hatással van a dátumok, számok és pénznemek megjelenítésére. Determinisztikus kimenet érdekében adjon át explicit kultúrát a(z) String.Create(IFormatProvider, DefaultInterpolatedStringHandler) elemnek:

CultureInfo[] cultures =
[
    CultureInfo.GetCultureInfo("en-US"),
    CultureInfo.GetCultureInfo("en-GB"),
    CultureInfo.GetCultureInfo("nl-NL"),
    CultureInfo.InvariantCulture
];
var date = new DateTime(2026, 5, 21, 12, 35, 31);
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       5/21/2026 12:35:31 PM      31,415,926.536
// => en-GB         21/05/2026 12:35:31      31,415,926.536
// => nl-NL         21-05-2026 12:35:31      31.415.926,536
// =>               05/21/2026 12:35:31      31,415,926.536

Invariáns kimenet (naplók, fájlformátumok, géppel olvasható adatok) esetén adja át a következőt CultureInfo.InvariantCulture:

var timestamp = new DateTime(2026, 5, 21, 15, 46, 24);
string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {timestamp}");
Console.WriteLine(message);
// => Date and time in invariant culture: 05/21/2026 15:46:24

Lásd még