$-String enterpolasyon (C# Başvurusu)

$Özel karakter, bir dize sabit değerini, enterpolasyonlu dize olarak tanımlar. Enterpolasyonlu dize, enterpolasyon ifadeleri içerebilen bir dize sabit değeri. Bir enterpolasyonlu dize bir sonuç dizesine çözümlendiğinde, enterpolasyon ifadesi içeren öğeler, ifade sonuçlarının dize gösterimleriyle değiştirilmiştir. Bu özellik C# 6 ' dan itibaren kullanılabilir.

Dize ilişkilendirme, dizeleri biçimlendirmek için daha okunabilir ve kullanışlı bir sözdizimi sağlar. Dize bileşik biçimlendirmesiniokumak daha kolay. Aynı çıktıyı üretmek için her iki özelliği kullanan aşağıdaki örneği karşılaştırın:

string 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.

Enterpolasyonlu bir dizenin yapısı

Bir dize sabit değerini, enterpolasyonlu bir dize olarak tanımlamak için, $ simgeyi simgesiyle önüne ekleyin. $Ve arasında " bir dize sabiti Başlatan boşluk olamaz.

Enterpolasyon ifadesi içeren bir öğenin yapısı aşağıdaki gibidir:

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

Köşeli parantezler 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. Öğesinin dize temsili null String.Empty .
alignment Değeri, ifade sonucunun dize temsilinde minimum karakter sayısını tanımlayan sabit ifade. Pozitif ise, dize temsili sağa hizalanır; negatifse, sola hizalanır. Daha fazla bilgi için bkz. Hizalama bileşeni.
formatString İfade sonucunun türü tarafından desteklenen bir biçim dizesi. Daha fazla bilgi için bkz. Biçim dize bileşeni.

Aşağıdaki örnek, yukarıda 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");
// Expected output is:
// |Left   |  Right|
//     3.14159265358979 - default formatting of the pi number
//                3.142 - display only three decimal digits of the pi number

C# 10 ' dan başlayarak, dize ilişkilendirmeyi kullanarak sabit bir dizeyi başlatabilirsiniz. Yer tutucular için kullanılan tüm ifadeler sabit dizeler olmalıdır. Diğer bir deyişle, her ilişkilendirme ifadesi bir dize olmalı ve bir derleme zamanı sabiti olmalıdır.

Özel karakterler

"{" Veya "}" küme ayracı eklemek için, enterpolasyonlu bir dize tarafından üretilen metinde, "{{" veya "}}" iki küme ayracı kullanın. Daha fazla bilgi için bkz. kaçış ayraçları.

İki nokta üst üste (":"), enterpolasyon ifadesi öğesinde koşullu bir işleç kullanmak için bir ilişkilendirme ifadesinde özel anlam içerdiğinden, bu ifadeyi parantez içine alın.

Aşağıdaki örnek, bir sonuç dizesinde bir küme ayracı nasıl ekleneceğini gösterir. Ayrıca, koşullu bir işlecin nasıl kullanılacağını 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.");
// Expected output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.

Ara değerli bir dize, karakteriyle ve $ ardından karakteri ile başlar @ . Tam dizeler hakkında daha fazla bilgi için bkz. dize ve tam tanımlayıcı makaleleri.

Not

C# 8,0 ' den başlayarak, $ ve @ belirteçlerini istediğiniz sırada kullanabilirsiniz: her ikisi de geçerli bir ara $@"..." @$"..." değerli dizeler. Önceki C# sürümlerinde, $ belirtecin belirtecin önüne gösterilmesi gerekir @ .

Örtük dönüştürmeler ve IFormatProvider uygulama belirtme

Enterpolasyonlu bir dizeden üç örtük dönüştürme vardır:

  1. Bir örneğe enterpolasyonlu dize dönüştürme String . Dize, enterpolasyonlu dize çözümlemenin sonucudur. Tüm enterpolasyon ifadesi öğeleri, sonuçlarının düzgün biçimli dize gösterimlerine göre değişir. Bu dönüştürme, ' ın CurrentCulture Biçim ifadesi sonuçlarını kullanır.

  2. Enterpolasyonlu bir dizenin FormattableString , bir bileşik biçim dizesini temsil eden, ifade sonuçlarıyla birlikte bir örneğe dönüştürülmesi. Bu, tek bir örnekten kültüre özgü içerikle birden çok sonuç dizesi oluşturmanıza olanak sağlar FormattableString . Bunu yapmak için aşağıdaki yöntemlerden birini çağırın:

    , ToString(IFormatProvider) Özel biçimlendirmeyi destekleyen arabirimin Kullanıcı tanımlı bir uygulamasını sağlar IFormatProvider . Daha fazla bilgi için .net makalesindeki biçimlendirme türleri konusunun ICustomFormatter ile özel biçimlendirme bölümüne bakın.

  3. Enterpolasyonlu bir dizenin IFormattable tek bir örnekten kültüre özgü içerikle birden çok sonuç dizesi oluşturmanıza izin veren bir örneğe dönüştürülmesi IFormattable .

Aşağıdaki örnek, FormattableString kültüre özgü sonuç dizeleri oluşturmak için için örtük dönüştürmeyi kullanır:

double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);

string messageInInvariantCulture = FormattableString.Invariant(message);

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected 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.

Ek kaynaklar

Dize ilişkilendirme için yeni başladıysanız, C# etkileşimli öğreticisinde dize ilişkilendirmeyi inceleyin. Ayrıca, C# öğreticisinde başka bir dize ilişkilendirmeyi da denetleyebilirsiniz. Bu öğreticide, biçimli dizeler oluşturmak için enterpolasyonlu dizelerin nasıl kullanılacağı gösterilmektedir.

Enterpolasyonlu dizelerin derlenmesi

Bir enterpolasyonlu dize türü varsa string , genellikle bir String.Format yöntem çağrısına dönüştürülür. String.Format String.Concat Çözümlenen davranış birleştirme ile eşdeğer olacaksa, derleyici ile değiştirilebilir.

Bir enterpolasyonlu dize türü IFormattable veya ise FormattableString , derleyici yöntemine bir çağrı oluşturur FormattableStringFactory.Create .

C# 10 ' dan başlayarak, bir enterpolasyonlu dize kullanıldığında derleyici, enterpolasyonlu dize işleyicisi düzenine uyan bir türe, ilişkili dizenin atanıp atanmadığını denetler. Enterpolasyonlu dize işleyicisi , enterpolasyonlu dizeyi bir dizeye dönüştüren özel bir türdür. Enterpolasyonlu dize işleyicisi, genellikle performans nedenleriyle kullanılan gelişmiş bir senaryodur. Enterpolasyonlu dize geliştirmeleriiçin dil belirtiminde bir enterpolasyonlu dize işleyicisi oluşturma gereksinimleri hakkında bilgi edinebilirsiniz. C# ' deki Yenilikler bölümünde, enterpolasyonlu dize işleyicisi öğreticisini aşağıdaki şekilde oluşturabilirsiniz. .NET 6 ' da, türünde bir bağımsız değişken için enterpolasyonlu dize kullandığınızda, string enterpolasyonlu dize tarafından işlenir System.Runtime.CompilerServices.DefaultInterpolatedStringHandler .

Not

Enterpolasyonlu dize işleyicilerinin bir yan etkisi de dahil olmak üzere özel bir işleyicinin, System.Runtime.CompilerServices.DefaultInterpolatedStringHandler tüm koşullarda ara değer dizesinde yer tutucu olarak kullanılan tüm ifadeleri değerlendiremeyebilir. Diğer bir deyişle, bu deyimlerdeki yan etkiler gerçekleşmeyebilir.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin enterpolasyonlu dizeler bölümüne bakın.

Ayrıca bkz.