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 ke string hasil, pengkompilasi mengganti item dengan ekspresi interpolasi oleh 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.
Dimulai dengan C# 10, Anda dapat menggunakan string terinterpolasi untuk menginisialisasi string konstanta . 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>[,<alignment>][:<formatString>]}
Elemen dalam tanda kurung siku bersifat opsional. Tabel berikut menjelaskan masing-masing elemen:
Elemen | Deskripsi |
---|---|
interpolationExpression |
Ekspresi yang membuat hasil yang akan diformat. Ketika ekspresi adalah null , outputnya adalah string kosong (String.Empty). |
alignment |
Ekspresi konstanta yang nilainya mendefinisikan jumlah minimum karakter dalam representasi string dari hasil ekspresi. Jika positif, representasi string selaras dengan kanan; jika negatif, rata kiri. Untuk informasi selengkapnya, lihat bagian Komponen perataan dari artikel Pemformatan komposit. |
formatString |
String format yang didukung oleh jenis 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 terinterpolasi
Dimulai dengan C# 11, Anda dapat menggunakan string mentah terinterpolasi literal, 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 mentah terinterpolasi literal 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, string mentah terinterpolasi literal dimulai dengan dua $
karakter. Anda perlu menempatkan setiap ekspresi interpolasi antara kurung kurawal ganda ({{
dan }}
). Satu kurung kurawal disematkan ke dalam string hasil. Jika Anda perlu menyematkan {
karakter atau }
berulang ke dalam string hasil, gunakan jumlah $
karakter yang tepat untuk menunjuk string mentah terinterpolasi literal. Jika string literal memiliki kurung kurawal yang lebih berulang 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 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 Kurung kurawal pelepasan dari artikel Pemformatan komposit.
Karena titik dua (":") memiliki arti khusus dalam item ekspresi interpolasi, untuk menggunakan operator kondisional 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 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#. Anda juga dapat memeriksa Interpolasi string lainnya dalam tutorial C#. Tutorial tersebut menunjukkan cara menggunakan string yang diinterpolasi untuk menghasilkan string yang diformat.
Kompilasi string yang diinterpolasi
Dimulai dengan C# 10 dan .NET 6, pengkompilasi 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.
Sebelum C# 10, jika string terinterpolasi memiliki jenis string
, biasanya diubah menjadi String.Format panggilan metode. 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:
- C# 10 - String terinterpolasi yang ditingkatkan
- C# 11 - Literal string mentah
- C# 11 - Baris baru dalam interpolasi string