Megosztás a következőn keresztül:


Karakterlánc interpolációjának használata a(z) $-val

A $ karakter sztring literálként azonosít egy interpolált sztringet. Az interpolált sztring olyan sztringkonstans, amely interpolációs kifejezéseket tartalmazhat. Amikor egy interpolált sztringből eredménysztring lesz, a fordító az interpolációs kifejezéseket a kifejezések eredményeinek sztring-ábrázolásaival helyettesíti.

A sztringek interpolációja olvashatóbb, kényelmesebb szintaxist biztosít a sztringek formázásához. Könnyebben olvasható, mint a sztringek összetett formázása. Az alábbi példa mindkét funkciót használja, hogy ugyanazt a kimenetet állítsa elő.

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.

Interpolált karakterlánc használatával inicializálhat állandó karakterláncot. Ezt csak akkor teheti meg, ha az interpolált sztringben lévő összes interpolációs kifejezés állandó sztring is.

Interpolált karakterlánc felépítése

Az interpolált sztringként való azonosításhoz a sztring literál elé helyezze a $ szimbólumot. Nem lehet szóköz a $ és " között, amikor egy sztring literált kezdesz.

Egy interpolációs kifejezéssel rendelkező elem felépítése a következő:

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

A szögletes zárójelek elemei nem kötelezőek. Az alábbi táblázat az egyes elemeket ismerteti:

Elem Leírás
interpolationExpression A formázandó eredményt eredményező kifejezés. Ha a kifejezés null, a kimenet a üres karakterlánc (String.Empty).
width Az a konstans kifejezés, amelynek értéke meghatározza a kifejezés eredményének sztringképében szereplő karakterek minimális számát. Ha pozitív, a sztring-ábrázolás jobbra van igazítva; ha negatív, balra igazított. További információért, lásd a Szélesség komponens szakaszát az összetett formázás című cikkben.
formatString A kifejezés eredményének típusa által támogatott formátumsztring. További információkért tekintse meg a Formátum karakterlánc összetevője szakaszt a Kompozit formázás cikkben.

Az alábbi példa az előző táblázatban ismertetett választható formázási összetevőket használja:

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

A C# 11-től kezdődően az interpolációs kifejezés új soraival olvashatóbbá teheti a kifejezés kódját. Az alábbi példa bemutatja, hogy az új sorok hogyan javíthatják a mintaegyezést tartalmazó kifejezések olvashatóságát:

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",
    }
    }";

Interpolált nyers karakterlánc kifejezések

A C# 11-től kezdődően használhat interpolált nyers szöveges literált, ahogy az alábbi példa is mutatja:

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

Ha { és } karaktereket szeretne beágyazni az eredménysztringbe, kezdjen egy interpolált nyers sztringlitert több $ karakterrel. Amikor ezt teszi, az eredménykaraktersorozatba beágyazódnak az olyan { vagy } karakterekből álló sorozatok, amelyek rövidebbek a $ karakterek számánál. Ha az interpolációs kifejezést a sztringbe szeretné befoglalni, a karakterek számával $ megegyező számú kapcsos zárójelet kell használnia, ahogyan az alábbi példa mutatja:

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}

Az előző példában egy interpolált nyers sztring literál két $ karakterrel kezdődik. Minden interpolációs kifejezést kettős zárójelek ({{ és }}) közé kell helyeznie. A kapcsos zárójel egy eredménystringbe van ágyazva. Ha ismétlődő { vagy } karaktereket szeretne beágyazni egy eredménysztringbe, használjon megfelelő számú $ karaktert egy interpolált nyers sztringkonstans kijelöléséhez. Ha a karakterlánc-literál több ismétlődő zárójelet tartalmaz, mint a $ karakterek száma, a { és } karakterek belülről kifelé csoportosítva vannak. Az előző példában a literál The point {{{X}}, {{Y}}} értékeli {{X}} és {{Y}} interpolált kifejezésekként. A külső { és } szó szerint szerepel a kimeneti karakterláncban.

Speciális karakterek

Ha "{" vagy "}" kapcsos zárójelet szeretne felvenni egy interpolált sztring által létrehozott szövegbe, használjon két kapcsos zárójelet: "{{" vagy "}}". További információkért lásd a Kapcsos zárójelek kilépése szakaszt a Kombinált formázás cikkben.

Mivel a kettőspont (":") speciális jelentéssel rendelkezik egy interpolációs kifejezéselemben, feltételes operátort kell használnia egy interpolációs kifejezésben. Ezt a kifejezést zárójelekbe kell írni.

Az alábbi példa bemutatja, hogyan lehet kapcsos zárójelet szerepeltetni egy eredmény sorban. A feltételes operátorok használatát is bemutatja:

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.

Egy interpolált szó szerinti sztring mind a $ és @ karakterekkel kezdődik. Az $ és @ tetszőleges sorrendben használható: mind a $@"..." és a @$"..." érvényes interpolált szó szerinti karakterláncok. A szó szerinti sztringekről a sztringekről és a szó szerinti azonosítókról szóló cikkekben talál további információt.

Kultúraspecifikus formázás

Alapértelmezés szerint egy interpolált karakterlánc a CultureInfo.CurrentCulture tulajdonság által meghatározott aktuális kultúrát használja minden formázási művelethez.

Ha egy interpolált sztringet egy kultúraspecifikus eredménysztringre szeretne feloldani, használja a String.Create(IFormatProvider, DefaultInterpolatedStringHandler) .NET 6-tól kezdődően elérhető metódust. Az alábbi példa bemutatja, hogyan teheti ezt meg:

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.

A .NET 5 és korábbi verzióiban használja az interpolált sztring implicit konvertálását egy FormattableString objektummá. Ezután használhat példánymetódust FormattableString.ToString(IFormatProvider) vagy statikus FormattableString.Invariant metódust egy kultúraspecifikus eredménysztring létrehozásához. Az alábbi példa bemutatja, hogyan teheti ezt meg:

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.

Az egyéni formázással kapcsolatos további információkért tekintse meg a .NET-cikkek formázási típusainakICustomFormatterrel foglalkozó szakaszát.

Egyéb erőforrások

Ha még nem ismerkedik a sztring-interpolációval, tekintse meg a sztring interpolációját a C# interaktív oktatóanyagában . Ez az oktatóanyag bemutatja, hogyan használhatók interpolált sztringek formázott sztringek előállítására.

Interpolált sztringek összeállítása

A fordító ellenőrzi, hogy az interpolált sztring olyan típushoz van-e hozzárendelve, amely megfelel az interpolált sztringkezelő mintájának. Az interpolált sztringkezelő olyan típus, amely az interpolált sztringet eredménysztringgé alakítja. Ha egy interpolált sztring típusa string, azt a System.Runtime.CompilerServices.DefaultInterpolatedStringHandler dolgozza fel. Az egyéni interpolált karakterlánc-kezelő példáját lásd az Egyéni karakterlánc interpoláció kezelő írása oktatóanyagban. Az interpolált sztringkezelő használata egy speciális forgatókönyv, amely általában teljesítménybeli okokból szükséges.

Megjegyzés:

Az interpolált sztringkezelők egyik mellékhatása, hogy az egyéni kezelők, beleértve az System.Runtime.CompilerServices.DefaultInterpolatedStringHandlerinterpolált sztringben lévő összes interpolációs kifejezést, minden feltétel mellett nem értékelhetik ki. Ez azt jelenti, hogy ezeknek a kifejezéseknek a mellékhatásai nem fordulhatnak elő.

Ha egy interpolált sztring típusa string, az általában String.Format metódushívássá alakul át. A fordító lecserélheti String.Format, String.Concat-re, ha az elemzett viselkedés egyenértékű az összefűzéssel.

Ha az interpolált sztring típusa IFormattable vagy FormattableString, a fordító meghívja a FormattableStringFactory.Create metódust.

C# nyelvspecifikáció

További információért tekintse meg az Interpolált sztringkifejezések szakaszt a C# nyelvi specifikációban, valamint az alábbi új funkcióspecifikációkat:

Lásd még