Saya memiliki versi percobaan Resharper dan selalu menyarankan agar saya mengganti string biasa ke string kata demi kata. Apa bedanya?
Saya memiliki versi percobaan Resharper dan selalu menyarankan agar saya mengganti string biasa ke string kata demi kata. Apa bedanya?
Jawaban:
String kata demi kata adalah string yang tidak perlu diloloskan, seperti nama file:
string myFileName = "C:\\myfolder\\myfile.txt";
akan menjadi
string myFileName = @"C:\myfolder\myfile.txt";
Simbol @ berarti membaca string itu secara harfiah, dan tidak menafsirkan karakter kontrol sebaliknya.
Ini tercakup dalam bagian 2.4.4.5 dari spesifikasi C # :
2.4.4.5 String literal
C # mendukung dua bentuk string literal: string literal biasa dan string literal kata demi kata.
Literal string reguler terdiri dari nol atau lebih karakter yang diapit dengan tanda kutip ganda, seperti pada "halo", dan dapat mencakup urutan escape sederhana (seperti \ t untuk karakter tab) dan urutan escape hexadecimal dan Unicode.
Literal string kata demi kata terdiri dari karakter @ diikuti oleh karakter tanda kutip ganda, nol atau lebih karakter, dan karakter tanda kutip ganda penutup. Contoh sederhana adalah @ "halo". Dalam string literal kata demi kata, karakter di antara pembatas diinterpretasikan secara verbatim, satu-satunya pengecualian adalah urutan kutipan-escape. Secara khusus, sekuens escape sederhana dan sekuens heksadesimal dan Unicode tidak diproses dalam string literal kata demi kata. Sebuah string literal kata demi kata dapat menjangkau beberapa baris.
Dengan kata lain satu-satunya karakter khusus dalam @ "string kata demi kata literal" adalah karakter kutipan ganda. Jika Anda ingin menulis string kata demi kata yang berisi kutipan ganda, Anda harus menulis dua kutipan ganda. Semua karakter lain diartikan secara harfiah.
Anda bahkan dapat memiliki baris baru literal dalam string literal kata demi kata. Dalam string literal biasa Anda tidak dapat memiliki baris baru literal. Sebagai gantinya Anda harus menggunakan misalnya "\n"
.
Verbatim string literal sering berguna untuk menyematkan nama file dan ekspresi reguler dalam kode sumber, karena backslash dalam tipe string ini adalah umum dan perlu melarikan diri jika string literal biasa digunakan.
Tidak ada perbedaan pada saat runtime antara string yang dibuat dari string literal biasa dan string yang dibuat dari string string verbatim - keduanya adalah tipe System.String
.
Tidak ada perbedaan runtime antara string dan string kata demi kata. Mereka hanya berbeda pada waktu kompilasi. Kompiler menerima urutan pelarian yang lebih sedikit dalam string kata demi kata sehingga apa yang Anda lihat adalah apa yang Anda dapatkan selain dari pelarian kutipan.
Anda juga dapat menggunakan karakter kata demi kata, @, untuk memberi tahu kompiler untuk memperlakukan kata kunci sebagai nama:
var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);
var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);
Anda dapat memiliki string multiline juga menggunakan string kata demi kata:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
tanpa @
Anda mendapat kesalahan.
Di VB14 ada fitur baru yang disebut Multiline Strings
, itu seperti string kata demi kata di C #.
Kiat pro: VB string literal sekarang persis seperti string C # verbatim.
String biasa menggunakan urutan pelarian khusus untuk menerjemahkan ke karakter khusus.
/*
This string contains a newline
and a tab and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");
String Verbatim diartikan apa adanya, tanpa menerjemahkan urutan escape:
/*
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");