Aracılığıyla paylaş


$ kullanılarak dize interpolasyonu

$ karakteri, bir dize sabitini interpolasyonlu bir dize olarak tanımlar. Ara dize, ilişkilendirme ifadeleri içerebilen bir dize sabitidir. İlişkili bir dize bir sonuç dizesine çözümlendiğinde, derleyici ifade sonuçlarının dize gösterimleriyle öğeleri ilişkilendirme ifadeleriyle değiştirir.

Dize ilişkilendirmesi, dizeleri biçimlendirmek için daha okunabilir ve kullanışlı bir söz dizimi sağlar. Okuması, dize bileşik biçimlendirmesinden daha kolaydır. Aşağıdaki örnek, aynı çıkışı oluşturmak için her iki özelliği de kullanır:

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.

sabit dizesini başlatmak için interpolasyonlu bir dize kullanabilirsiniz. Bunu yalnızca, ilişkilendirilmiş dizedeki tüm ilişkilendirme ifadeleri de sabit dizelerse yapabilirsiniz.

İlişkili dizenin yapısı

Bir dize değişmezini ara dize olarak tanımlamak için, başına $ sembolünü ekleyin. $ ile ", dize değişmezini başlatırken arasında hiçbir boşluk olamaz.

İlişkilendirme ifadesi olan bir öğenin yapısı aşağıdaki gibidir:

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

Köşeli ayraç içindeki öğeler isteğe bağlıdır. Aşağıdaki tabloda her öğe açıklanmaktadır:

Öğe Açıklama
interpolationExpression Biçimlendirilecek bir sonuç üreten ifade. ifadesi olduğunda null, çıkış boş dizedir (String.Empty).
width Değeri ifade sonucunun dize gösterimindeki en az karakter sayısını tanımlayan sabit ifade. Pozitifse, dize gösterimi sağa hizalanır; negatifse, sola hizalı. Daha fazla bilgi için Birleşik biçimlendirme makalesinin Genişlik bileşeni bölümüne bakınız.
formatString İfade sonucunun türü tarafından desteklenen bir biçim dizesi. Daha fazla bilgi için Birleşik biçimlendirme makalesinin Biçim dizesi bileşeni bölümüne bakın.

Aşağıdaki örnek, önceki tabloda açıklanan isteğe bağlı biçimlendirme bileşenlerini kullanır:

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

C# 11'den başlayarak, ifadenin kodunu daha okunabilir hale getirmek için bir ilişkilendirme ifadesi içinde yeni satırlar kullanabilirsiniz. Aşağıdaki örnekte, yeni satırların desen eşleştirme içeren bir ifadenin okunabilirliğini nasıl geliştirebileceği gösterilmektedir:

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

Enterpolasyonlu ham dize değişmezleri

C# 11'den başlayarak, aşağıdaki örnekte gösterildiği gibi iliştirilmiş bir ham metin sabiti kullanabilirsiniz.

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

Sonuç dizesine { ve } karakterlerini gömmek için, birden fazla $ karakter içeren ilişkilendirilmiş bir ham dize değişmez değeri başlatın. Bunu yaptığınızda, { veya } karakterlerinden oluşan ve $ karakter sayısından daha kısa olan herhangi bir dizi sonuç dizesine gömülür. Bu dizenin içindeki ilişkilendirme ifadelerini içine almak için, aşağıdaki örnekte gösterildiği gibi karakter sayısıyla aynı sayıda $ ayraç kullanmanız gerekir:

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}

Yukarıdaki örnekte, ilişkilendirilmiş bir ham dize değişmez değeri iki $ karakterle başlar. Her ilişkilendirme ifadesini çift ayraçlar ({{ ve }}) arasına yerleştirmeniz gerekir. Sonuç dizisine tek bir küme ayracı gömülür. Bir sonuç dizesine yinelenen { veya } karakter eklemeniz gerekiyorsa, ilişkilendirilmiş ham dize değişmez değerini ayarlamak için uygun sayıda $ karakter kullanın. Dize değişmez değerdeki yinelenen küme ayracı sayısı $ karakteri sayısından fazlaysa, { ve } karakterleri içeriden dışarıya doğru gruplandırılır. Önceki örnekte, doğrudan The point {{{X}}, {{Y}}} ve {{X}}, {{Y}} ifadelerini ilişkilendirilmiş ifadeler olarak yorumlar. Dış { ve } , çıkış dizesine eksiksiz olarak eklenir.

Özel karakterler

Interpolasyonlu dize ile üreteceğiniz metne "{" veya "}" eklemek amacıyla iki ayraç kullanın: "{{" veya "}}". Daha fazla bilgi için Birleşik biçimlendirme makalesinin Süslü parantezlerden kaçış bölümüne bakın.

İki nokta üst üste (":") bir ilişkilendirme ifadesi öğesinde özel bir anlama sahip olduğundan, ilişkilendirme ifadesinde koşullu işleç kullanmak için kullanılır. Bu ifadeyi parantez içine alın.

Aşağıdaki örnekte, bir sonuç dizesine ayraç ekleme gösterilmektedir. Ayrıca koşullu işlecin nasıl kullanılacağını da gösterir:

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.

Ara yerleştirilmiş bir düz metin dizesi $ ve @ karakterleriyle başlar. $ ve @ etiketlerini herhangi bir sıra ile kullanabilirsiniz: hem $@"..." hem de @$"..." geçerli iç içe geçmiş özgün dizelerdir. Ayrıntılı dizeler hakkında daha fazla bilgi için dize ve ayrıntılı tanımlayıcı makalelerine bakın.

Kültüre özgü biçimlendirme

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.

Kültüre özel bir sonuç dizesine ulaşmak için, .NET 6 ile birlikte sunulan String.Create(IFormatProvider, DefaultInterpolatedStringHandler) yöntemini kullanın. Aşağıdaki örnek bunun nasıl yapılacağını gösterir:

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.

.NET 5 ve önceki .NET sürümlerinde, interpolasyonlu bir dizenin bir FormattableString örneğine dönüştürülmesi için örtük dönüşümü kullanın. Ardından, kültüre özgü bir sonuç dizesi oluşturmak için bir örnek FormattableString.ToString(IFormatProvider) yöntemi veya statik FormattableString.Invariant bir yöntem kullanabilirsiniz. Aşağıdaki örnek bunun nasıl yapılacağını gösterir:

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.

Özel biçimlendirme hakkında daha fazla bilgi için .NET'te biçimlendirme türleri makalesinin ICustomFormatter ile özel biçimlendirme bölümüne bakın.

Diğer kaynaklar

Dize ilişkilendirmeyi yeni kullanıyorsanız C# etkileşimli öğreticisinde dize ilişkilendirmesi bölümüne bakın. Bu öğreticide, biçimlendirilmiş dizeler oluşturmak için ilişkilendirilmiş dizelerin nasıl kullanılacağı gösterilmektedir.

Ara dizelerin derlenmesi

Derleyici, ilişkilendirilmiş dizeninilişkilendirilmiş dize işleyici desenini karşılayan bir türe atandığını denetler. İlişkili dize işleyicisi, ilişkilendirilmiş dizeyi bir sonuç dizesine dönüştüren bir türdür. Bir iliştirilmiş dize string türündeyse, System.Runtime.CompilerServices.DefaultInterpolatedStringHandler tarafından işlenir. Özel ilişkilendirilmiş dize işleyicisi örneği için Bkz. Özel dize ilişkilendirme işleyicisi yazma öğreticisi . İnterpolasyonlu dize işleyicisi kullanımı, genellikle performans nedenleriyle gerekli olan gelişmiş bir durumdur.

Uyarı

Ara dize işleyicilerinin bir yan etkisi, System.Runtime.CompilerServices.DefaultInterpolatedStringHandler dahil olmak üzere özel bir işleyicinin tüm koşullar altında ara dize içindeki tüm ilişkilendirme ifadelerini değerlendirmeyebileceğidir. Bu, bu ifadelerin yan etkilerinin oluşmayabileceği anlamına gelir.

İlişkili bir dize stringtürüne sahipse, genellikle bir String.Format yöntemi çağrısına dönüştürülür. Derleyici, çözümlenen davranışın birleştirmeye eşdeğer olması durumunda String.Format öğesini String.Concat ile değiştirebilir.

İliştirilen dize IFormattable veya FormattableString türüne sahipse, derleyici FormattableStringFactory.Create yöntemine bir çağrı oluşturur.

C# dil belirtimi

Daha fazla bilgi için C# dil belirtimininİlişkili dize ifadeleri bölümüne ve aşağıdaki yeni özellik belirtimlerine bakın:

Ayrıca bakınız