Normal bir dize ile kelimesi kelimesine bir dize arasındaki fark nedir?


166

Resharper deneme sürümü var ve her zaman düzenli dizeleri kelimesi kelimesine dizeleri önerir. Fark ne?


3
ReSharper'ın bu önerisini hiç görmedim. Bunu önerdiği yere bir örnek verebilir misiniz?
John Saunders

3
Az önce anladım. İlk öneri onu bir kaynağa taşımaktı, ikincisi ise kelimesi kelimesine bir dize yapmaktı: MessageBox.Show ("İşin devam edebilmesi için bir platypus yazılmalıdır.");
B. Clay Shannon

Hala her zaman anlıyorum. Genellikle kapatmak istediğiniz yeniden şekillendirici uyarılarından biridir, çünkü dizeleri hiçbir sebeple kelimesi kelimesine yapmayı önerir.
Dean Swiatek

Visual Studio IDE için önerilen özelliğimden hoşlanıyorsanız, lütfen buradan oy verin: developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

Yanıtlar:


191

Bir sözcük dizesi, bir dosya adı gibi kaçması gerekmeyen bir dizedir:

string myFileName = "C:\\myfolder\\myfile.txt";

olabilir

string myFileName = @"C:\myfolder\myfile.txt";

@ Sembolü bu dizeyi kelimenin tam anlamıyla okumak ve kontrol karakterlerini başka şekilde yorumlamamak anlamına gelir.


12
Resharper'ın neden bu değişikliği önerdiğini merak ediyorum. Herhangi bir CLR gurusu, kaçış karakterleri göz ardı edilebileceğinden, sözcük dizelerinin daha verimli işlenip işlenmediğini biliyor mu?
Matt Peterson

9
Ben belki ReSharper bunu söylüyor çünkü verbatim dize daha okunabilir.
andyp

36
Bunun bir tür kodlama kuralı olduğuna inanıyorum (daha önce hiç görmedim ya da duymadım). Dizeler için ReSharper, yerelleştirme için bir kaynak dosyasına taşımanızı veya sözlü hale getirmenizi önerir - sözlü dizeler için ReSharper artık dizeyi yerelleştirme seçeneği sunmaz. Dolayısıyla, yerelleştirmeye ihtiyaç duymayan tüm dizeleri kelimesi kelimesine yapmak bir kural gibi görünüyor.
Daniel Brückner

Dize değişkeni dize değişkenine atanmış diyelim, dize myFileName = "C: \\ myfolder \\ myfile.txt"; Şimdi, myFileName dize değişkenini kelimesi kelimesine dönüştürmek istiyorum. Nasıl yaparım? Bu çalışıyor mu? string verbatimStr = @myFileName;
sanjeev bhusal

3
@sanjeevbhusal: Bunu gerçekten hiç yapmazsınız. @ "C: \ myfolder \ myfile.txt" ve "C: \\ myfolder \\ myfile.txt", CLR ile aynı şeydir. Temelde sadece sözdizimsel şeker.
alc6379

68

Bu, C # spesifikasyonunun 2.4.4.5 bölümünde ele alınmıştır :

2.4.4.5 Dize değişmezleri

C # dize değişmezlerinin iki biçimini destekler: normal dize değişmez değerleri ve kelimesi kelimesine dize değişmez değerleri.

Normal dize değişmez değeri, "merhaba" gibi çift tırnak içine alınmış sıfır veya daha fazla karakterden oluşur ve hem basit kaçış dizilerini (sekme karakteri için \ t gibi) hem de onaltılık ve Unicode kaçış dizilerini içerebilir.

Bir sözcük dizesi değişmezi, @ karakterinden sonra çift tırnak karakteri, sıfır veya daha fazla karakter ve kapanış çift tırnak karakteri içerir. Basit bir örnek @ "merhaba" dır. Kelimesi kelimesine bir dize değişmezinde, ayırıcılar arasındaki karakterler kelimesi kelimesine yorumlanır, tek istisna bir tırnak-kaçış-dizisidir. Özellikle, basit kaçış dizileri ve onaltılık ve Unicode kaçış dizileri, kelimesi kelimesine dizgi değişmezlerinde işlenmez. Bir sözcük dizesi değişmezi birden çok satıra yayılabilir.

Diğer bir deyişle, @ "verbatim string literal" daki tek özel karakter çift tırnak karakteridir. Çift tırnak içeren bir sözcük dizesi yazmak istiyorsanız, iki çift tırnak yazmanız gerekir. Diğer tüm karakterler tam anlamıyla yorumlanır.

Kelimenin tam anlamıyla bir dizgi değişmezinde yeni satırlar bile olabilir. Normal bir dizgi değişmezinde değişmez yeni satırlar olamaz. Bunun yerine örneğin kullanmalısınız "\n".

Aynen dizgi değişmezleri genellikle dosya kodlarını ve düzenli ifadeleri kaynak koduna gömmek için kullanışlıdır, çünkü bu tür dizelerde ters eğik çizgiler yaygındır ve normal bir dizgi değişmezi kullanılmışsa kaçması gerekir.

Çalışma zamanında, normal dize değişmezlerinden oluşturulan dizeler ile kelimesi kelimesine bir dize değişmezlerinden oluşturulan dizeler arasında fark yoktur - her ikisi de türdür System.String.


27

Bir dize ve sözcük dizesi arasında çalışma zamanı farkı yoktur. Sadece derleme zamanında farklıdırlar. Derleyici, sözlü bir dizede daha az kaçış dizisi kabul eder, böylece bir alıntıdan başka ne görürsen onu alırsın.

Derleyiciye bir anahtar kelimeye ad olarak davranmasını bildirmek için kelimesi kelimesi @ olan da kullanabilirsiniz:

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);

16

Aynen dizeleri kullanarak da çok satırlı dizeye sahip olabilirsiniz:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

@senin bir hata olmadan .

VB14'te yeni bir özellik var, Multiline StringsC # 'da kelimesi kelimesine benziyor.

Çok Satırlı Dizeler

Profesyonel ipucu: VB string değişmezleri artık tam olarak C # kelimesi kelimesine benzer.


13

Düzenli dizeler, özel karakterlere çevirmek için özel kaçış dizileri kullanır.

/*
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\\");

Aynen dizeleri, herhangi bir kaçış dizisi çevrilmeden olduğu gibi yorumlanır:

/* 
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\\.");

0

Yeniden Paylaşıcı uyarılarını kaldırmak istiyorsanız, şunları kullanabilirsiniz:

Localizable(false)

Parametreler gibi şeyler için, dosya konumları, ör. bu iyi bir çözüm olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.