Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az oktatóanyag bemutatja, hogyan használhatja a sztringinterpolációt a kifejezések eredményeinek formázására és felvételére egy eredményláncban. A példák feltételezik, hogy ismeri az alapvető C# fogalmakat és a .NET-típusformázást. 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
Az interpolált sztringként való azonosításhoz a sztring literál elé helyezze a $ szimbólumot. 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. Minden interpolált sztringnek rendelkeznie kell a következőkkel:
- Egy sztringkonstans, amely a
$karakterrel kezdődik, még a nyitó idézőjel karaktere előtt. A szimbólum és az$idézőjel karakter között nem lehet szóköz. - Egy vagy több interpolációs kifejezés. Egy interpolációs kifejezést jelöl egy nyitó és záró kapcsos zárójeltel (
{és}). Bármilyen C#-kifejezést elhelyezhet, amely értéket ad vissza (beleértvenull) a kapcsos zárójelek között.
A C# az alábbi szabályokkal értékeli ki a { és } karakterek közötti kifejezést:
- Ha az interpolációs kifejezés értéke
null, akkor egy üres sztring ("" vagy String.Empty) kerül használatra. - Ha az interpolációs kifejezés kiértékelése nem ad eredményt
null, akkor általában az eredménytípusToStringmetódusát hívják meg.
Formátumsztring megadása interpolációs kifejezéshez
A kifejezés eredményének típusa által támogatott formátumsztring megadásához 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ókért tekintse meg a Formátum karakterlánc összetevője szakaszt a Kompozit formázás cikkben.
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>,<width>}
A következő kódminta a minimális mezőszélesség használatával hoz létre táblázatos kimenetet:
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}|");
}
// Output:
// 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 a szélesség értéke pozitív, a formázott kifejezés eredménye jobbra van igazítva; ha negatív, akkor balra igazított. Távolítsa el a - jeleket a szélesség-meghatározó előtt, és futtassa újra a mintát az eredmények megtekintéséhez.
Ha a szélességet és a formátumsztringet is meg kell adnia, kezdje a szélesség összetevővel:
{<interpolationExpression>,<width>:<formatString>}
Az alábbi példa bemutatja, hogyan adhatja meg a szélességet és 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 rendszer figyelmen kívül hagyja a szélességi értéket.
További információért, lásd a Szélesség komponens szakaszát az összetett formázás című cikkben.
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 a $ és @ karakterekkel kezdődik. Az $ és @ tetszőleges sorrendben használható: mind a $@"..." és a @$"..." érvényes interpolált szó szerinti karakterláncok.
Ha be szeretne illeszteni egy kapcsos zárójelet, "{" vagy "}", egy eredménysztringbe, 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.
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
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ény karakterlánc létrehozása karakterlánc-interpolációval
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.
A .NET 6 kezdetétől az String.Create(IFormatProvider, DefaultInterpolatedStringHandler) módszert használva az interpolált sztringeket kultúraspecifikus eredmény sztringgé feloldhatók, 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 implicit módon alakítson át egy interpolált sztringet egy System.FormattableString példányra, majd hívja meg annak ToString(IFormatProvider) metódusát 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 a String.Create(IFormatProvider, DefaultInterpolatedStringHandler) metódust használja az interpolált sztring egy eredménysztringre való feloldásához, 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
Következteté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.