Aracılığıyla paylaş


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. .NET'teki biçimlendirme türleri hakkında daha fazla bilgi için bkz. .NET'te biçimlendirme türleri.

Giriş

Bir dize değişmezini ara dize olarak tanımlamak için, başına $ sembolünü ekleyin. Bir değer döndüren geçerli bir C# ifadesini bir ara dize içine yerleştirebilirsiniz. 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>}

Interpolasyonlu dizeler, dize bileşik biçimlendirme özelliğinin tüm yeteneklerini destekler. Bu, onları yöntem String.Format kullanımına göre daha okunabilir bir alternatif haline getirir. İlişkilendirilmiş her dizenin şu şekilde olması gerekir:

  • Açılış tırnak işareti karakterinden önce $ karakteriyle başlayan bir dize değişmez değeri. Simge ile tırnak işareti karakteri arasında $ boşluk olamaz.
  • Bir veya daha fazla ilişkilendirme ifadesi. Açma ve kapatma ayracı ({ ve }) içeren bir ilişkilendirme ifadesi belirtirsiniz. Ayraçlar içine bir değer döndüren herhangi bir C# ifadesi (c0 dahil) koyabilirsiniz.

C#, { ve } karakterleri arasındaki ifadeyi aşağıdaki kurallarla değerlendirir.

  • İlişkilendirme ifadesi olarak değerlendirilirse null, boş bir dize (""veya String.Empty) kullanılır.
  • Eğer ilişkilendirme ifadesi null değerine değerlendirilmezse, genellikle sonuç türünün ToString yöntemi çağrılır.

İ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 Birleşik biçimlendirme makalesinin Biçim dizesi bileşeni 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>,<width>}

Aşağıdaki kod örneği, tablosal çıkış oluşturmak için en düşük alan genişliğini kullanır:

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|

Genişlik değeri pozitifse, biçimlendirilmiş ifade sonucu sağa hizalanır; negatifse sola hizalanır. - Genişlik belirticiden önceki işaretleri kaldırın ve sonuçları görmek için örneği yeniden çalıştırın.

Hem genişlik hem de biçim dizesi belirtmeniz gerekiyorsa, width bileşeniyle başlayın:

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

Aşağıdaki örnek, genişlik ve hizalamanın nasıl belirtileceğini gösterir ve metin alanlarını sınırlandırmak için kanal karakterlerini ("|") kullanır:

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 genişlik değeri yoksayılır.

Daha fazla bilgi için Birleşik biçimlendirme makalesinin Genişlik bileşeni bölümüne bakınız.

Bir interpolasyonlu dizede kaçış dizilerini kullanma

Enterpolasyon dizeleri, sıradan dize değişmez değerlerinde kullanılabilecek tüm kaçış dizilerini destekler. Daha fazla bilgi için bkz. Dize kaçış sekansları.

Kaçış dizilerini kelime anlamında yorumlamak için verbatim dize değişmezini kullanın. Hem $ hem @ karakterleriyle başlayan bir iliştirilen düz metin dizesi. $ ve @ etiketlerini herhangi bir sıra ile kullanabilirsiniz: hem $@"..." hem de @$"..." geçerli iç içe geçmiş özgün dizelerdir.

Sonuç dizesine "{" veya "}" küme parantezi eklemek için iki parantez kullanın: "{{" veya "}}". Daha fazla bilgi için Birleşik biçimlendirme makalesinin Süslü parantezlerden kaçış bölümüne bakın.

Aşağıdaki örnek, bir sonuç dizesine küme ayraçlarının nasıl ekleneceğini ve doğrudan bir ilişkilendirilmiş dizeyi nasıl oluşturacağınızı göstermektedir.

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

İnterpolasyonlu ham dize ifadeleri kullanabilirsiniz.

Bir interpolasyon ifadesinde üçüncül koşullu operatör ?: nasıl kullanılır

İ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, bir interpolated dize, tüm biçimlendirme işlemleri için CultureInfo.CurrentCulture özelliği tarafından tanımlanan mevcut kültürü kullanır.

.NET 6'den başlayarak, aşağıdaki örnekte gösterildiği gibi kültüre özgü bir sonuç dizesine dönüştürmek için String.Create(IFormatProvider, DefaultInterpolatedStringHandler) yöntemini kullanabilirsiniz:

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, ilişkilendirilmiş bir dizenin örtük dönüştürmesini bir System.FormattableString örneğine yapın ve ona ait ToString(IFormatProvider) yöntemini çağırarak kültüre özgü bir sonuç dizesi oluşturun. 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'dan itibaren, aşağıdaki örnekte gösterildiği gibi String.Create(IFormatProvider, DefaultInterpolatedStringHandler) yöntemini kullanarak, InvariantCulture için bir ara değerli dizgiyi bir sonuç dizgisine çözümleyebilirsiniz.

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 bakınız