C # 'da bir dizenin önündeki @ nedir?


604

Bu C # (veya muhtemelen VB.net) için bir .NET sorudur, ancak aşağıdaki bildirimler arasındaki farkın ne olduğunu anlamaya çalışıyorum:

string hello = "hello";

vs.

string hello_alias = @"hello";

Konsola yazdırmak fark etmez, uzunluk özellikleri aynıdır.


Daha iyi sözcük dizimi biçimlendirmesi için lütfen Visual Studio IDE ile ilgili önerime bakın (ve oy verin): Çok satırlı sözcük dizelerini girinti yapın .
Olivier Jacot-Descombes

Açık olmak gerekirse, yukarıdaki örnekler aynı veya sonuçsuz aynı sonucu vermektedir @.
Miro J.

Yanıtlar:


768

Dizeyi kelimesi kelimesine bir dize değişmezi olarak işaretler - dizede normalde bir kaçış dizisi olarak yorumlanacak herhangi bir şey yoksayılır.

Yani "C:\\Users\\Rich"aynı@"C:\Users\Rich"

Bir istisna vardır: çift tırnak için bir kaçış sırası gerekir. Çift tırnaktan kaçmak için arka arkaya iki çift tırnak koymanız gerekir. Örneğin, olarak @""""değerlendirir ".


1
@RichardEverett Cevabı anladım, ama şüphem bu özelliğin gerçek kullanımı nedir?
Arun

24
@Arun Genellikle kendilerinden kaçması gereken şeylere düzenli ifade tanımları gibi şeyler içeren dizelerle uğraşırken gerçekten yararlıdır
James Thorpe

25
+ çok satırlı içerikler
Jaider

4
{{bir string.Formatçağrıda normal bir parantez kullanmak istiyorsanız, parantezleri ikiye katlamanız gerekecektir .
Dave Cousineau

4
@RichardEverett, çizgiyi parçalara ayırmak zorunda kalmadan çok satırlı dize değişmezleri oluşturmak için çok yararlıdır.
John Mott

256

Kelimenin tam anlamıyla bir dizgi . Bu, kaçmanın uygulanmadığı anlamına gelir. Örneğin:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

Burada verbatimve regularaynı içeriğe sahip.

Ayrıca SQL için çok kullanışlı olabilecek çok satırlı içeriğe de izin verir:

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

Kelimesi kelimesine dizgi değişmezleri için gerekli olan bir kaçış, ikiye katlayarak yaptığınız bir çift tırnak (") almaktır:

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";

16
Ayrılmış sözcüklerin değişken adları ve diğer öğeler olarak kullanılmasına da izin verir. Public int GetValueOrDefault (int @default) gibi;
Svish

5
Svish: Doğru ama bu özel soru ile ilgisi yok.
Jon Skeet

63

'@' İfadesinin başka bir anlamı daha vardır: bunu değişken bir bildirimin önüne koymak, ayrılmış anahtar kelimeleri değişken adları olarak kullanmanızı sağlar.

Örneğin:

string @class = "something";
int @object = 1;

Bunun için sadece bir veya iki meşru kullanım buldum. Temelde ASP.NET MVC'de böyle bir şey yapmak istediğinizde:

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

Hangi gibi bir HTML bağlantısı üretir:

<a href="/Controller/Action" class="some_css_class">Text</a>

Aksi takdirde, ayrılmış bir anahtar kelime olmayan, ancak 'C' büyük harfinin HTML standartlarına uymadığı ve doğru görünmediği 'Sınıf'ı kullanmanız gerekir.


18

Açıkça VB'yi de sorduğunuzdan, bu sözlü dize sözdiziminin VB'de, sadece C #'da olmadığını ekleyeyim. Aksine, tüm dizeler VB'de kelimesi kelimesine aykırıdır (C # kelimesi kelimesine göre satır sonları içerememeleri hariç):

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

Kaçış dizileri, birkaç şeyi daha karmaşık hale getiren VB'de (C # kelimesi kelimesi gibi alıntı karakterinin ikiye katlanması hariç) mevcut değildir. Örneğin, VB'de aşağıdaki kodu yazmak için birleştirme (veya bir dize oluşturmak için diğer yollardan herhangi birini) kullanmanız gerekir.

string x = "Foo\nbar";

VB'de bu şöyle yazılacaktır:

Dim x = "Foo" & Environment.NewLine & "bar"

( &VB dizesi birleştirme operatörüdür. +eşit olarak kullanılabilir.)


1
Ah benim, bu can sıkıcı geliyor ... daha da şimdi C # kullanıyorum sevindim: p
Svish

Satır sonlarını VB dizgi değişmezlerine gömemezsiniz, ancak C # 'ın kelimesi kelimesine dizgi değişmezlerine girebilirsiniz. Bu yüzden aynı değiller.
Joey

@Svish, Bekle bir şey mi kaçırıyorum? Bu hiç VB için bir con değil. Aslında burası VB'nin C # kazandığı bir yer. Bunu bu şekilde yapmak ve tüm özel karakterleri "ve arasına atmak yerine satırsonlarını ve özel karakterleri açıkça birleştirmek daha iyidir ".
Pacerier

@Pacerier Bu saçmalık. Önemsiz dize işlemeden daha fazlasını yapar yapmaz, uygun dize oluşturma tesisleri vazgeçilmezdir ve bunlar arasında özel karakterleri kısaca kullanma yeteneği ön plandadır. Bununla birlikte, hem C # hem de VB buna String.Formatizin verir. Aslında, şimdi asla yazmak "x" & Environment.NewLineve bunun yerine her zamanString.Format("x{0}", Environment.Newline) vb kullanmak istiyorum . Yine de, C # burada daha uygundur.
Konrad Rudolph

@KonradRudolph, seçerdim "x" & nl & nlya "x" + nl + nlda "x" . $nl . $nlherhangi bir günü "x\n\n". Ayrıca "x" + bs + bs bitti "x\\\\". Ve "x" + q + qüzeri "x\"\""/ "x""""". Şimdi ise String.Format, bu, yukarıda yaptığımız karşılaştırmayla ilgili olmayan başka bir konudur.
Pacerier

10

http://msdn.microsoft.com/en-us/library/aa691090.aspx

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.

Kelimesi kelimesine bir dize değişmez değeri, @ karakteri ve ardından ç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, sınırlayıcılar arasındaki karakterler kelimesi kelimesine yorumlanır, tek istisna bir alıntı-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.


9

Bu bir sözcük dizgisidir ve kaçan kuralları değiştirir - şimdi kaçan tek karakter "", "" karakterine kaçmıştır. Bu özellikle dosya yolları ve normal ifade için kullanışlıdır:

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

vb


Örnekteki @ işaretini kaçırmıyor musun Marc? Yoksa var kullandığımda varsayılan mı? Biraz karıştı ...
Dirk Vollmar

1
Tamam - bu gerçekten, gerçekten tuhaf. Editör onları munched mi acaba?
Marc Gravell

9

MSDN'den kopyalandı :

Derleme zamanında, sözcük dizeleri aynı kaçış dizileriyle sıradan dizelere dönüştürülür. Bu nedenle, hata ayıklayıcı izleme penceresinde bir sözcük dizesini görüntülerseniz, kaynak kodunuzdan sözcük biçimini değil, derleyici tarafından eklenen çıkış karakterlerini görürsünüz. Örneğin, sözlü dize @"C:\files.txt"izleme penceresinde olarak görünür "C:\\files.txt".


Microsoft belgelerinin tipik yanıltıcı bir parçası olan IMHO! Son sonuç olarak yukarıdaki durum doğrudur, ancak bunun altında yatan gerçek, C # 'daki dizelerin ilgili bayt dizisine (veya çok baytlı karakter kodlarına) dönüştürülmesidir. C #, "" "veya" ... "ile temel dizeyi temsil etmenin iki farklı yolunu sağlar. Hata ayıklayıcı her zaman "..." yolunu seçer ve hangisinin ilk sırada kullanıldığını söyleyemez. (\ N veya "" gibi kaçış dizileri yalnızca programlama ve görüntüleme düzeyi dize temsili ile ilgilidir ve altta yatan dize asla saklanmaz!)
MikeBeaton

8

@Bir dizenin önüne a koymak, özel kodlar kullanmadan veya kaçış karakterleri kullanmadan ters eğik çizgi veya çift tırnak işareti gibi özel karakterler kullanmanıza olanak tanır.

Böylece şunları yazabilirsiniz:

string path = @"C:\My path\";

onun yerine:

string path = "C:\\My path\\";

3

Açıklama basit. Dizesini temsil etmek "string\", derleyici ihtiyacı "string\\"nedeniyle \bir kaçış karakteridir. Eğer kullanırsanız @"string\"bunun yerine, unutabilirsiniz \\.

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.