Literal string mentah

Tip

Artikel ini adalah bagian dari bagian Dasar-Dasar untuk pengembang yang sudah mengetahui setidaknya satu bahasa pemrograman dan mempelajari C#. Jika Anda baru menggunakan pemrograman, mulailah dengan tutorial Memulai terlebih dahulu. Untuk tata bahasa lengkap, lihat referensi bahasa.

Berasal dari bahasa lain? Literal string mentah di C# berfungsi sama seperti string r"..." di Python dan Rust, blok teks Java ("""..."""), serta string templat back-tick di JavaScript, TypeScript, dan Go. Sintaks C# paling dekat dengan blok teks Java, dengan aturan tambahan untuk pemisah dan interpolasi panjang variabel.

String mentah harfiah dibatasi oleh tiga atau lebih tanda kutip ganda. Di antara pembatas, setiap karakter diartikan secara harfiah. Tanda kutip dan garis miring terbalik tidak perlu melarikan diri, dan baris baru dipertahankan seperti yang ditulis. Gunakan string mentah untuk string apa pun yang berisi tanda kutip, garis miring terbelakang, atau beberapa baris: JSON, XML, SQL, ekspresi reguler, jalur file, dan sampel kode.

Warning

Literal string mentah membuat SQL lebih mudah dibaca, tetapi tidak membuat SQL lebih aman. Jangan pernah menggabungkan atau menginterpolasi nilai yang disediakan pengguna ke dalam perintah SQL. Praktik itu membuka aplikasi Anda ke injeksi SQL. Gunakan perintah berparameter sebagai gantinya: DbCommand.CreateParameter dengan DbParameterCollection.Add, atau pembantu tingkat yang lebih tinggi di Entity Framework Core dan Dapper. Perhatian yang sama berlaku untuk format rawan injeksi lainnya seperti perintah shell, filter LDAP, dan HTML.

Literal yang berisi tanda kutip dan garis miring balik

Literal reguler memerlukan karakter escape untuk " dan \. Verbatim literal masih memerlukan "" untuk menyisipkan kutipan. Literal mentah tidak memerlukan keduanya:

// Same JSON value, three ways:
string regular  = "{ \"name\": \"Ada\", \"path\": \"C:\\\\src\" }";
string verbatim = @"{ ""name"": ""Ada"", ""path"": ""C:\\src"" }";
string raw      = """{ "name": "Ada", "path": "C:\\src" }""";

Console.WriteLine(regular  == raw);   // True
Console.WriteLine(verbatim == raw);   // True

Setiap formulir menghasilkan string yang sama, tetapi versi mentahnya berbunyi persis seperti JSON yang diwakilinya.

String mentah baris tunggal

Pembatas pembuka dan pembatas penutup masing-masing terdiri atas setidaknya tiga tanda kutip ganda, dan pembatas penutup harus menggunakan jumlah tanda kutip yang sama dengan pembatas pembuka. Konten berada di antara keduanya pada baris yang sama. Tanda kutip dan garis miring balik di dalam konten ditafsirkan secara literal:

// A raw string literal starts and ends with at least three quotes.
// Inside, " and \ are literal — no escaping required.
string message = """She said "hi" and left.""";
string regex   = """\d{3}-\d{4}""";

Console.WriteLine(message);   // She said "hi" and left.
Console.WriteLine(regex);     // \d{3}-\d{4}

String mentah satu baris tidak boleh kosong di antara pemisahnya. Ini dapat berakhir dengan tanda kutip ganda, tetapi tidak dapat dimulai dengan satu. Kompilator menganggap tanda petik ganda di awal sebagai karakter pembatas pembuka tambahan. Jika konten Anda harus diawali dengan tanda kutip, gunakan literal string mentah multibaris sebagai gantinya, yang menempatkan konten pada baris tersendiri sehingga tanda kutip di awal tidak menimbulkan ambiguitas.

String mentah multibaris

Untuk konten multibaris, pembatas pembuka mengakhiri baris dan pembatas penutup memulainya sendiri. Seperti halnya string mentah satu baris, pembatasnya adalah tiga atau lebih tanda kutip ganda, dan pembatas penutup harus menggunakan jumlah tanda kutip yang sama seperti pembatas pembuka. Tiga tanda kutip adalah yang paling umum, tetapi Anda dapat menggunakan empat, lima, atau lebih jika kontennya sendiri berisi rangkaian """. Segala sesuatu di antara dua pemisah adalah nilai string, persis seperti yang ditulis:

// The opening """ and closing """ each sit on their own line.
// The content between them is the value, exactly as written.
string sql = """
    SELECT id, name
    FROM customers
    WHERE active = 1
    """;

Console.WriteLine(sql);

Baris baru segera setelah pembukaan """ dan baris baru segera sebelum penutupan """ bukan bagian dari nilai. Itu adalah spasi pembatas. Demikian juga, kompilator menghapus spasi kosong apa pun di sebelah kiri penutup """ dari setiap baris konten, sehingga Anda dapat mengindentasi literal agar sesuai dengan blok kode penutupnya tanpa indentasi yang muncul dalam string. Bagian berikutnya mencakup aturan ini secara rinci.

Jika konten tersebut berisi rangkaian """, gunakan empat atau lebih tanda kutip sebagai pembatas. Jumlah pembatas hanya perlu melebihi rangkaian tanda kutip terpanjang dalam konten. Lihat Literal string mentah (referensi bahasa) untuk aturan lengkap.

Indentasi: delimiter penutup menentukan margin

Kolom penutup """ menentukan margin kiri. Pengkompilasi menghapus spasi kosong hingga kolom tersebut dari setiap baris konten. Aturan ini memungkinkan Anda mengindentasi literal agar sesuai dengan kode di sekitarnya tanpa mencemari nilai:

// The column of the closing """ sets a left margin.
// Whitespace up to that column is stripped from every content line.
string xml = """
        <order id="42">
            <item>book</item>
        </order>
        """;

// First content line begins at column 0 of the value:
Console.WriteLine(xml);
/* Output:
   <order id="42">
       <item>book</item>
   </order>
 */

Jika baris konten memiliki lebih sedikit karakter spasi kosong di depan daripada kolom pembatas penutup, pengkompilasi melaporkan kesalahan. Pastikan semua baris konten memiliki inden setidaknya sama dengan tag penutup """.

String terinterpolasi mentah

$ Tambahkan awalan ke string mentah untuk mengaktifkan interpolasi. Ekspresi dalam {} lubang dievaluasi, dan hasilnya dimasukkan ke dalam nilai :

// A single $ before """ enables interpolation: single { and } mark a hole.
// Inside a single-$ raw string, literal braces aren't allowed — use $$ when
// the content also contains literal { or }.
string name = "Ada";
int    score = 95;

string report = $"""
    Player:  {name}
    Score:   {score}
    Updated: {DateTime.UtcNow:yyyy-MM-dd}
    """;

Console.WriteLine(report);

Jika konten terinterpolasi Anda juga memerlukan karakter literal { atau }, lihat Literal string mentah (referensi bahasa).

Kapan memilih literal tertentu

Gunakan string mentah harfiah setiap kali konten berisi tanda kutip, garis miring terbelakang, atau beberapa baris. Hasilnya lebih ringkas untuk dibaca, lebih mudah ditempel ke atau disalin dari, dan bebas dari bug terkait urutan escape.

Gunakan literal string biasa untuk nilai singkat satu baris tanpa tanda kutip atau garis miring balik, seperti nama, pesan, dan placeholder format.

Gunakan string verbatim literal (@"...") hanya saat bekerja dengan kode yang ada yang menggunakannya. Untuk kode baru, string mentah mencakup semua kasus yang dapat ditangani oleh string verbatim, dengan sintaks yang lebih bersih untuk tanda kutip di dalamnya.

Baca juga