Apa perbedaan antara string biasa dan string kata demi kata?

166

Saya memiliki versi percobaan Resharper dan selalu menyarankan agar saya mengganti string biasa ke string kata demi kata. Apa bedanya?

Xaisoft
sumber
3
Saya belum pernah melihat saran ini dari ReSharper. Bisakah Anda memberi contoh di mana itu menyarankan ini?
John Saunders
3
Saya baru mendapatkannya. Saran pertama adalah memindahkannya ke sumber daya, tetapi yang kedua adalah membuatnya menjadi string kata demi kata: MessageBox.Show ("Platipus harus dibelai sebelum pekerjaan dapat dilanjutkan.");
B. Clay Shannon
Saya masih mendapatkannya setiap saat. Ini umumnya salah satu peringatan penyelamat yang ingin Anda matikan, karena itu menyarankan membuat string kata demi kata tanpa alasan apa pun.
Dean Swiatek
Jika Anda menyukai fitur yang saya sarankan untuk Visual Studio IDE, silakan angkat suara di sini: developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

Jawaban:

191

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.

alc6379
sumber
12
Saya bertanya-tanya mengapa Resharper menyarankan perubahan ini. Apakah ada guru CLR yang tahu jika string kata demi kata diproses lebih efisien karena karakter pelarian dapat diabaikan?
Matt Peterson
9
Saya pikir mungkin ReSharper menyarankannya karena string kata demi kata lebih mudah dibaca.
andyp
36
Saya percaya ini adalah semacam konvensi pengkodean (saya belum pernah melihat atau mendengar sebelumnya). Untuk string ReSharper menyarankan untuk memindahkannya ke file sumber daya untuk pelokalan atau membuatnya menjadi kata demi kata - untuk string kata demi kata ReSharper maka tidak lagi menawarkan opsi untuk melokalisasi string. Jadi sepertinya konvensi untuk membuat semua string yang tidak perlu lokalisasi kata demi kata.
Daniel Brückner
Katakanlah kita memiliki string literal yang ditugaskan ke variabel string, string myFileName = "C: \\ myfolder \\ myfile.txt"; Sekarang, saya ingin mengonversi variabel string myFileName ke string kata demi kata. Bagaimana saya melakukannya? Apakah ini berhasil? string verbatimStr = @myFileName;
sanjeev bhusal
3
@sanjeevbhusal: Anda tidak benar-benar pernah melakukannya. @ "C: \ myfolder \ myfile.txt" dan "C: \\ myfolder \\ myfile.txt" adalah hal yang sama dengan CLR. Ini hanya gula sintaksis, pada dasarnya.
alc6379
68

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.

Mark Byers
sumber
27

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);
Corbin March
sumber
16

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

String Multiline

Kiat pro: VB string literal sekarang persis seperti string C # verbatim.

Mohamad Shiralizadeh
sumber
13

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\\.");
BoltClock
sumber
0

Jika Anda ingin menghapus peringatan Resharper, Anda dapat menggunakan:

Localizable(false)

Untuk hal-hal seperti parameter, lokasi file, mis. ini bisa menjadi solusi yang bagus.

Dan kamu
sumber