Sztring interpolációja C-ben#

Ez az oktatóanyag bemutatja, hogyan formázhatja és felveheti a kifejezéseredményeket eredménysztringbe sztringbe sztring interpolációval. A példák feltételezik, hogy ismeri az alapvető C# fogalmakat és a .NET-típusformázást. Ha még nem használt sztringinterpolációt vagy .NET-típusformázást, először tekintse meg az interaktív sztring interpolációs oktatóanyagát . A .NET formázási típusaival kapcsolatos további információkért lásd: Formázástípusok a .NET-ben.

Bevezetés

Ha egy sztringkonstanst interpolált sztringként szeretne azonosítani, a szimbólummal $ előre fel kell függesztetnie. Bármilyen érvényes C#-kifejezést beágyazhat, amely interpolált sztringben ad vissza értéket. A következő példában a kifejezés kiértékelése után az eredmény sztringgé alakul, és egy eredménysztringben szerepel:

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

Ahogy a példa is mutatja, egy kifejezést egy interpolált sztringbe kell foglalnia úgy, hogy kapcsos zárójeleket tartalmaz:

{<interpolationExpression>}

Az interpolált sztringek támogatják a sztringek összetett formázási funkciójának összes funkcióját. Így olvashatóbb alternatívát alkotnak a String.Format módszer használata helyett.

Formátumsztring megadása interpolációs kifejezéshez

Ha olyan formátumsztringet szeretne megadni, amelyet a kifejezés eredményének típusa támogat, kövesse az interpolációs kifejezést kettősponttal (":) és a formátumsztringgel:

{<interpolationExpression>:<formatString>}

Az alábbi példa bemutatja, hogyan adhat meg szabványos és egyéni formázási sztringeket dátum- és idő- vagy numerikus eredményeket eredményező kifejezésekhez:

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.

További információt az Összetett formázás című cikk Sztringösszetevők formázása című szakaszában talál.

A formázott interpolációs kifejezés mezőszélességének és igazításának szabályozása

A mező minimális szélességének és a formázott kifejezés eredményének igazításának megadásához kövesse az interpolációs kifejezést vesszővel (",") és az állandó kifejezéssel:

{<interpolationExpression>,<alignment>}

Ha az igazítási érték pozitív, a formázott kifejezés eredménye jobbra igazított, negatív esetben balra igazított.

Ha az igazítást és a formátumsztringet is meg kell adnia, kezdje az igazítási összetevővel:

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

Az alábbi példa bemutatja, hogyan adhatja meg az igazítást, és hogyan lehet csőkarakterek ("|") használatával elválasztani a szövegmezőket:

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|

Ahogy a példakimenet is mutatja, ha a formázott kifejezés eredményének hossza meghaladja a megadott mezőszélességű értéket, a program figyelmen kívül hagyja az igazítási értéket.

További információ: Az összetett formázási cikk Igazítás összetevő szakasza.

Menekülési sorozatok használata interpolált sztringben

Az interpolált sztringek támogatják a szokásos sztringkonstansokban használható összes feloldósorozatot. További információ: Sztringek feloldási sorozatai.

A feloldósorozatok szó szerinti értelmezéséhez használjon szó szerinti sztringkonstanst. Az interpolált szó szerinti sztring mindkettővel $ és @ karakterekkel kezdődik. Használhatja $ és @ tetszőleges sorrendben: mindkettő $@"..." , és @$"..." érvényes interpolált szó szerinti sztringek.

Ha "{" vagy "}" kapcsos zárójelet szeretne felvenni egy eredménysztringbe, használjon két kapcsos zárójelet({{) vagy "}}". További információ: Az összetett formázási cikk Szökőkapcsos zárójelek szakasza.

Az alábbi példa bemutatja, hogyan lehet kapcsos zárójeleket belefoglalni egy eredménysztringbe, és hogyan lehet szó szerint interpolált sztringet létrehozni:

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

A C# 11-től kezdődően használhat interpolált nyers sztringkonstansokat.

Ternáris feltételes operátor ?: használata interpolációs kifejezésben

Mivel a kettőspont (":") speciális jelentéssel rendelkezik egy interpolációs kifejezéssel rendelkező elemben, ha feltételes operátort szeretne használni egy kifejezésben, zárójelek közé foglalja azt, ahogyan az alábbi példa mutatja:

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

Kultúraspecifikus eredménysztring létrehozása sztringinterpolációval

Alapértelmezés szerint az interpolált sztring a tulajdonság által definiált jelenlegi kultúrát használja az CultureInfo.CurrentCulture összes formázási művelethez.

A .NET 6-tól kezdődően az String.Create(IFormatProvider, DefaultInterpolatedStringHandler) interpolált sztringeket egy kultúraspecifikus eredménysztringre is fel lehet oldani, ahogy az alábbi példa mutatja:

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

A .NET korábbi verzióiban használjon implicit átalakítást egy interpolált sztring példányra System.FormattableString , és hívja meg annak metódusát ToString(IFormatProvider) egy kultúraspecifikus eredménysztring létrehozásához. Az alábbi példa bemutatja, hogyan teheti ezt meg:

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

Ahogy a példa is mutatja, egy FormattableString példány használatával több eredménysztringet hozhat létre különböző kultúrákhoz.

Eredménysztring létrehozása az invariáns kultúra használatával

A .NET 6-tól kezdődően az interpolált sztring egy eredménysztringre való feloldásához InvariantCulturehasználja a String.Create(IFormatProvider, DefaultInterpolatedStringHandler) metódust, ahogy az alábbi példa is mutatja:

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

A .NET korábbi verzióiban a FormattableString.ToString(IFormatProvider) metódussal együtt használhatja a statikus FormattableString.Invariant metódust, ahogy az alábbi példa is mutatja:

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

Összegzés

Ez az oktatóanyag a sztring interpolációjának gyakori forgatókönyveit ismerteti. A sztring interpolációjáról további információt a Sztring interpoláció című témakörben talál. A .NET formázási típusaival kapcsolatos további információkért tekintse meg a .NET és az összetett formázási cikkek formázási típusait.

Kapcsolódó információk