C'de dize ilişkilendirmesi#

Bu öğreticide, bir sonuç dizesine ifade sonuçlarını biçimlendirmek ve eklemek için dize ilişkilendirmenin nasıl kullanılacağı gösterilmektedir. Örneklerde, temel C# kavramları ve .NET tür biçimlendirmesi hakkında bilgi sahibi olduğunuz varsayılır. Dize ilişkilendirme veya .NET tür biçimlendirmesi hakkında yeniyseniz, önce etkileşimli dize ilişkilendirme öğreticisine göz atın. .NET'teki biçimlendirme türleri hakkında daha fazla bilgi için bkz . .NET'te biçimlendirme türleri.

Giriş

Bir dize sabitini ilişkilendirilmiş bir dize olarak tanımlamak için, bunu simgesiyle $ ekleyin. İlişkili bir dizede değer döndüren geçerli bir C# ifadesi ekleyebilirsiniz. Aşağıdaki örnekte, bir ifade değerlendirilir değerlendirilmez sonucu bir dizeye dönüştürülür ve sonuç dizesine eklenir:

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

Örnekte gösterildiği gibi, bir ifadeyi ayraç içine alarak ilişkilendirilmiş bir dizeye eklersiniz:

{<interpolationExpression>}

İlişkili dizeler, dize bileşik biçimlendirme özelliğinin tüm özelliklerini destekler. Bu, onları yöntemin kullanımına String.Format daha okunabilir bir alternatif yapar.

İlişkilendirme ifadesi için biçim dizesi belirtme

İfade sonucunun türü tarafından desteklenen bir biçim dizesi belirtmek için, iki nokta üst üste (":") ile ilişkilendirme ifadesini ve biçim dizesini izleyin:

{<interpolationExpression>:<formatString>}

Aşağıdaki örnekte, tarih ve saat veya sayısal sonuçlar üreten ifadeler için standart ve özel biçim dizelerinin nasıl belirtildiği gösterilmektedir:

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.

Daha fazla bilgi için Bileşik biçimlendirme makalesinin Dize bileşenini biçimlendirme bölümüne bakın.

Biçimlendirilmiş ilişkilendirme ifadesinin alan genişliğini ve hizalamasını denetleme

En düşük alan genişliğini ve biçimlendirilmiş ifade sonucunun hizalamasını belirtmek için, virgül (",") ile ilişkilendirme ifadesini ve sabit ifadeyi izleyin:

{<interpolationExpression>,<alignment>}

Hizalama değeri pozitifse, biçimlendirilmiş ifade sonucu sağa hizalanır; negatifse sola hizalanır.

Hem hizalama hem de biçim dizesi belirtmeniz gerekiyorsa hizalama bileşeniyle başlayın:

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

Aşağıdaki örnekte hizalamanın nasıl belirtileceği ve metin alanlarını sınırlandırmak için kanal karakterlerinin ("|") nasıl kullanıldığı gösterilmektedir:

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|

Örnek çıktıda gösterildiği gibi, biçimlendirilmiş ifade sonucunun uzunluğu belirtilen alan genişliğini aşarsa hizalama değeri yoksayılır.

Daha fazla bilgi için Bileşik biçimlendirme makalesinin Hizalama bileşeni bölümüne bakın.

İlişkili bir dizede kaçış dizilerini kullanma

İlişkili dizeler, sıradan dize değişmez değerlerinde kullanılabilecek tüm kaçış dizilerini destekler. Daha fazla bilgi için bkz . Dize kaçış dizileri.

Kaçış dizilerini tam anlamıyla yorumlamak için düz metin dizesi değişmez değeri kullanın. İlişkilendirilmiş bir düz metin dizesi hem hem de $@ karakterleriyle başlar. ve @ öğesini herhangi bir sırada kullanabilirsiniz$: hem @$"..." hem de $@"..." geçerli ilişkilendirilmiş düz metin dizeleridir.

Sonuç dizesine "{" veya "}" küme ayracı eklemek için iki ayraç kullanın: "{{" veya "}}". Daha fazla bilgi için Bileşik biçimlendirme makalesinin Kaçış ayraçları bölümüne bakın.

Aşağıdaki örnekte, bir sonuç dizesine küme ayraçlarının nasıl eklenip ayrıntılı bir ilişkilendirilmiş dizenin nasıl oluşturacakları gösterilmektedir:

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

C# 11'den başlayarak, ilişkilendirilmiş ham dize değişmez değerlerini kullanabilirsiniz.

İlişkilendirme ifadesinde üçüncül koşullu işleç ?: kullanma

İki nokta üst üste (":") ilişkilendirme ifadesi olan bir öğede özel bir anlama sahip olduğundan, ifadede koşullu işleç kullanmak için aşağıdaki örnekte gösterildiği gibi bunu parantez içine alın:

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

Dize ilişkilendirmesi ile kültüre özgü sonuç dizesi oluşturma

Varsayılan olarak, ilişkilendirilmiş dize tüm biçimlendirme işlemleri için özelliği tarafından CultureInfo.CurrentCulture tanımlanan geçerli kültürü kullanır.

.NET 6'den başlayarak, aşağıdaki örnekte gösterildiği gibi kültüre özgü bir sonuç dizesiyle ilişkilendirilmiş bir dizeyi çözümlemek için yöntemini kullanabilirsiniz String.Create(IFormatProvider, DefaultInterpolatedStringHandler) :

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

.NET'in önceki sürümlerinde, bir örneğe ilişkilendirilmiş dizenin örtük dönüştürmesini System.FormattableStringToString(IFormatProvider) kullanın ve kültüre özgü bir sonuç dizesi oluşturmak için yöntemini çağırın. Aşağıdaki örnek bunun nasıl yapılacağını gösterir:

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

Örnekte gösterildiği gibi, bir FormattableString örneği kullanarak çeşitli kültürler için birden çok sonuç dizesi oluşturabilirsiniz.

Sabit kültürü kullanarak sonuç dizesi oluşturma

.NET 6'den başlayarak, aşağıdaki örnekte gösterildiği gibi , için bir sonuç dizesine ilişkilendirilmiş bir dizeyi InvariantCultureçözümlemek için yöntemini kullanınString.Create(IFormatProvider, DefaultInterpolatedStringHandler):

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şağıdaki örnekte gösterildiği gibi, .NET'in önceki sürümlerinde yöntemiyle FormattableString.ToString(IFormatProvider) birlikte statik FormattableString.Invariant yöntemi kullanabilirsiniz:

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

Sonuç

Bu öğreticide, dize ilişkilendirme kullanımıyla ilgili yaygın senaryolar açıklanmaktadır. Dize ilişkilendirmesi hakkında daha fazla bilgi için bkz . Dize ilişkilendirme. .NET'teki biçimlendirme türleri hakkında daha fazla bilgi için .NET'te biçimlendirme türleri ve Bileşik biçimlendirme makalelerine bakın.

Ayrıca bkz.