To jest pytanie .NET dla C # (lub ewentualnie VB.net), ale próbuję dowiedzieć się, jaka jest różnica między następującymi deklaracjami:
string hello = "hello";
vs.
string hello_alias = @"hello";
Wydruk na konsoli nie ma znaczenia, właściwości długości są takie same.
@
.Odpowiedzi:
Oznacza ciąg jako dosłowny dosłowny ciąg - wszystko w ciągu, które normalnie byłoby interpretowane jako sekwencja ucieczki, jest ignorowane.
Więc
"C:\\Users\\Rich"
to samo co@"C:\Users\Rich"
Jest jeden wyjątek: sekwencja ucieczki jest potrzebna dla podwójnego cudzysłowu. Aby uniknąć podwójnego cudzysłowu, musisz umieścić dwa podwójne cudzysłowy w rzędzie. Na przykład
@""""
ocenia na"
.źródło
{{
jeśli chcesz używać zwykłego nawiasu klamrowego wstring.Format
rozmowie.Jest to dosłowny ciąg dosłowny . Oznacza to, że ucieczka nie jest stosowana. Na przykład:
Tutaj
verbatim
iregular
mają tę samą zawartość.Umożliwia także zawartość wieloliniową - co może być bardzo przydatne w SQL:
Jedynym elementem ucieczki, który jest niezbędny do dosłownych literałów łańcuchowych, jest uzyskanie podwójnego cudzysłowu („), który robisz, podwajając go:
źródło
„@” Ma również inne znaczenie: umieszczenie go przed deklaracją zmiennej pozwala na użycie zastrzeżonych słów kluczowych jako nazw zmiennych.
Na przykład:
Znalazłem tylko jedno lub dwa uzasadnione zastosowania do tego. Głównie w ASP.NET MVC, jeśli chcesz zrobić coś takiego:
Który tworzyłby link HTML taki jak:
W przeciwnym razie trzeba użyć „Klasy”, która nie jest zastrzeżonym słowem kluczowym, ale wielkie litery „C” nie spełniają standardów HTML i po prostu nie wyglądają dobrze.
źródło
Ponieważ wyraźnie poprosiłeś również o VB, dodam tylko, że ta pełna składnia łańcuchowa nie istnieje w VB, tylko w C #. Przeciwnie, wszystkie ciągi są dosłownie w VB (z wyjątkiem faktu, że nie mogą one zawierać podziały wiersza, w przeciwieństwie do C # verbatim strings):
Sekwencje specjalne nie istnieją w VB (z wyjątkiem podwojenia znaku cudzysłowu, jak w ciągach C #), co czyni kilka rzeczy bardziej skomplikowanymi. Na przykład, aby napisać następujący kod w VB, musisz użyć konkatenacji (lub dowolnego innego sposobu skonstruowania łańcucha)
W VB byłoby to napisane w następujący sposób:
(
&
jest operatorem konkatenacji ciągów VB.+
Równie dobrze można użyć.)źródło
"
i"
.String.Format
, co pozwala to zrobić. W rzeczywistości nigdy nie pisałbym"x" & Environment.NewLine
, a zamiast tego zawsze używałemString.Format("x{0}", Environment.Newline)
itd. Mimo to C # jest tutaj wygodniejszy."x" & nl & nl
lub"x" + nl + nl
lub"x" . $nl . $nl
dowolny dzień nad"x\n\n"
. Też"x" + bs + bs
skończone"x\\\\"
. I"x" + q + q
ponad"x\"\""
/"x"""""
. Jeśli chodzi o toString.Format
, to kolejny problem niezwiązany z powyższym porównaniem.http://msdn.microsoft.com/en-us/library/aa691090.aspx
C # obsługuje dwie formy literałów ciągowych: zwykłe literały ciągowe i dosłowne ciągi literalne.
Zwykły literał ciąg składa się z zerowej lub większej liczby znaków zawartych w podwójnych cudzysłowach, jak w „hello”, i może zawierać zarówno proste sekwencje specjalne (takie jak \ t dla znaku tabulacji), jak i sekwencje specjalne szesnastkowe i Unicode.
Dosłowny ciąg literowy składa się ze znaku @, po którym następuje znak podwójnego cudzysłowu, zero lub więcej znaków oraz znak podwójnego cudzysłowu zamykającego. Prostym przykładem jest @ „hello”. W dosłownym ciągu literalnym znaki między ogranicznikami są interpretowane dosłownie, jedynym wyjątkiem jest sekwencja ucieczki cytatu. W szczególności proste sekwencje specjalne oraz sekwencje szesnastkowe i Unicode nie są przetwarzane w dosłownym ciągu literałów. Dosłowny ciąg literalny może obejmować wiele wierszy.
źródło
Jest to dosłowny ciąg znaków, który zmienia reguły zmiany znaczenia - jedynym znakiem, który jest teraz zmieniany, jest „, znak zmiany znaczenia na„ ”. Jest to szczególnie przydatne w przypadku ścieżek plików i wyrażeń regularnych:
itp
źródło
Skopiowano z MSDN :
źródło
Stawianie
@
znaku przed ciągiem umożliwia użycie znaków specjalnych, takich jak odwrotny ukośnik lub cudzysłowy, bez konieczności używania specjalnych kodów lub znaków specjalnych.Możesz więc napisać:
zamiast:
źródło
Wyjaśnienie jest proste. Aby przedstawić ciąg
"string\"
, kompilator potrzebuje,"string\\"
ponieważ\
jest to znak zmiany znaczenia. Jeśli użyjesz@"string\"
zamiast tego, możesz zapomnieć o\\
.źródło