Bagikan melalui


Interpolasi string menggunakan $

Karakter $ mengidentifikasi string literal sebagai string terinterpolasi. String yang diinterpolasi adalah string literal yang mungkin berisi ekspresi interpolasi. Saat string terinterpolasi diselesaikan menjadi string hasil, pengkompilasi mengganti item dengan ekspresi interpolasi melalui representasi string dari hasil ekspresi.

Interpolasi string menyediakan sintaks yang lebih mudah dibaca dan nyaman untuk memformat string. Lebih mudah dibaca daripada format komposit string . Contoh berikut menggunakan kedua fitur untuk menghasilkan output yang sama:

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.

Anda dapat menggunakan string terinterpolasi untuk menginisialisasi sebuah konstanta string . Anda dapat melakukannya hanya jika semua ekspresi interpolasi dalam string terinterpolasi juga merupakan string konstanta.

Struktur string yang diinterpolasi

Untuk mengidentifikasi string literal sebagai string yang diinterpolasi, tambahkan simbol $. Tidak boleh ada spasi kosong di antara $ dan " yang memulai string literal.

Struktur item dengan ekspresi interpolasi adalah sebagai berikut:

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

Elemen dalam tanda kurung siku bersifat opsional. Tabel berikut menjelaskan masing-masing elemen:

Elemen Deskripsi
interpolationExpression Ekspresi yang menghasilkan hasil untuk diformat. Ketika ekspresi adalah null, outputnya adalah string kosong (String.Empty).
width Ekspresi konstanta yang nilainya mendefinisikan jumlah minimum karakter dalam representasi string dari hasil ekspresi. Jika positif, representasi string rata kanan; jika negatif, rata kiri. Untuk informasi selengkapnya, lihat bagian Komponen lebar dari artikel Pemformatan komposit .
formatString Format string didukung oleh tipe hasil ekspresi. Untuk informasi selengkapnya, lihat bagian Komponen String Format dari artikel Pemformatan Komposit.

Contoh berikut menggunakan komponen pemformatan opsional yang dijelaskan dalam tabel sebelumnya:

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

Dimulai dengan C# 11, Anda dapat menggunakan baris baru dalam ekspresi interpolasi untuk membuat kode ekspresi lebih mudah dibaca. Contoh berikut menunjukkan bagaimana baris baru dapat meningkatkan keterbacaan ekspresi yang melibatkan pencocokan pola:

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

Literal string mentah yang terinterpolasi

Dimulai dengan C# 11, Anda dapat menggunakan string mentah literal terinterpolasi, seperti yang ditunjukkan contoh berikut:

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

Untuk menyematkan karakter { dan } dalam string hasil, mulai string literal mentah yang terinterpolasi dengan beberapa karakter $. Saat Anda melakukannya, urutan { atau } karakter apa pun yang lebih pendek dari jumlah $ karakter disematkan dalam string hasil. Untuk mengapit ekspresi interpolasi apa pun dalam string tersebut, Anda perlu menggunakan jumlah kurung kurawal yang sama dengan jumlah $ karakter, seperti yang ditunjukkan contoh berikut:

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}

Dalam contoh sebelumnya, literal string mentah yang terinterpolasi dimulai dengan dua karakter yaitu $. Anda perlu menempatkan setiap ekspresi interpolasi antara kurung kurawal ganda ({{ dan }}). Satu kurung kurawal tunggal disematkan dalam string hasil. Jika Anda perlu menyematkan karakter { yang berulang atau } ke dalam string hasil, gunakan jumlah karakter $ yang tepat untuk menunjukkan string mentah literal terinterpolasi. Jika string literal memiliki kurung kurawal berulang lebih banyak daripada jumlah karakter $, karakter { dan } dikelompokkan dari dalam ke luar. Dalam contoh sebelumnya, literal The point {{{X}}, {{Y}}} menafsirkan {{X}} dan {{Y}} sebagai ekspresi terinterpolasi. Bagian luar { dan } disertakan secara verbatim dalam string output.

Karakter khusus

Untuk menyertakan tanda kurung kurawal, "{" atau "}", dalam teks yang dihasilkan oleh string yang diinterpolasi, gunakan dua tanda kurung kurawal, "{{" atau "}}". Untuk informasi selengkapnya, lihat bagian Pelepasan kurung kurawal dari artikel Pemformatan komposit.

Karena titik dua (":") memiliki arti khusus dalam item ekspresi interpolasi, operator kondisional dapat digunakan dalam ekspresi interpolasi. Sertakan ekspresi tersebut dalam tanda kurung.

Contoh berikut menunjukkan cara memasukkan tanda kurung kurawal dalam string hasil. Contoh berikut juga menunjukkan cara menggunakan operator bersyarat:

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.

String verbatim yang terinterpolasi dimulai dengan karakter dan $. Anda dapat menggunakan $ dan @ dalam urutan apa pun: keduanya $@"..." dan @$"..." merupakan string verbatim terinterpolasi yang valid. Untuk informasi selengkapnya tentang string kata demi kata, lihat artikel string dan pengidentifikasi kata demi kata.

Pemformatan khusus budaya

Secara default, string terinterpolasi menggunakan budaya yang saat ini yang ditentukan oleh CultureInfo.CurrentCulture properti untuk semua operasi pemformatan.

Untuk mengatasi string terinterpolasi ke string hasil khusus budaya, gunakan String.Create(IFormatProvider, DefaultInterpolatedStringHandler) metode , yang tersedia dimulai dengan .NET 6. Contoh berikut ini menunjukkan cara melakukannya:

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.

Di .NET 5 dan versi .NET yang lebih lama, gunakan konversi implisit dari string terinterpolasi ke FormattableString instans. Kemudian, Anda dapat menggunakan metode instans FormattableString.ToString(IFormatProvider) atau metode statis FormattableString.Invariant untuk menghasilkan string hasil khusus budaya. Contoh berikut ini menunjukkan cara melakukannya:

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.

Untuk informasi selengkapnya tentang pemformatan kustom, lihat bagian Pemformatan kustom dengan ICustomFormatter dari artikel Tipe pemformatan di .NET .

Sumber daya lainnya

Jika Anda baru mengenal interpolasi string, lihat tutorial interaktif Interpolasi string dalam C#. Tutorial tersebut menunjukkan cara menggunakan string yang diinterpolasi untuk menghasilkan string yang diformat.

Kompilasi string yang diinterpolasi

Kompilator memeriksa apakah string terinterpolasi ditetapkan ke jenis yang memenuhi pola handler string terinterpolasi . Handler string terinterpolasi adalah jenis yang mengonversi string terinterpolasi menjadi string hasil. Ketika string terinterpolasi memiliki jenis string, string tersebut diproses oleh System.Runtime.CompilerServices.DefaultInterpolatedStringHandler. Untuk contoh handler string terinterpolasi kustom, lihat tutorial Menulis handler interpolasi string kustom. Penggunaan handler string terinterpolasi adalah skenario lanjutan, biasanya diperlukan karena alasan performa.

Catatan

Salah satu efek samping dari handler string terinterpolasi adalah bahwa handler kustom, termasuk System.Runtime.CompilerServices.DefaultInterpolatedStringHandler, mungkin tidak mengevaluasi semua ekspresi interpolasi dalam string terinterpolasi di bawah semua kondisi. Itu berarti efek samping dari ekspresi tersebut mungkin tidak terjadi.

Jika string terinterpolasi memiliki jenis string, biasanya diubah menjadi panggilan metode String.Format. Pengkompilasi dapat menggantikan String.Format dengan jika perilaku yang dianalisis akan setara dengan String.Concat perangkaian.

Jika string yang diinterpolasi memiliki jenis IFormattable atau FormattableString, pengompilasi membuat panggilan ke metode FormattableStringFactory.Create.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian Ekspresi string terinterpolasi dari spesifikasi bahasa C# dan spesifikasi fitur baru berikut ini:

Lihat juga