Mam wersję próbną Resharper i zawsze sugeruje, żebym zmienił ciągi zwykłe na ciągi dosłowne. Jaka jest różnica?
Mam wersję próbną Resharper i zawsze sugeruje, żebym zmienił ciągi zwykłe na ciągi dosłowne. Jaka jest różnica?
Odpowiedzi:
Dosłowny ciąg to taki, który nie wymaga zmiany znaczenia, jak nazwa pliku:
string myFileName = "C:\\myfolder\\myfile.txt";
byłoby
string myFileName = @"C:\myfolder\myfile.txt";
Symbol @ oznacza dosłowne odczytywanie tego ciągu i nie interpretuje w inny sposób znaków sterujących.
Jest to omówione w sekcji 2.4.4.5 specyfikacji języka C # :
2.4.4.5 Literały łańcuchowe
C # obsługuje dwie formy literałów ciągów: zwykłe literały ciągów i dosłowne literały ciągów.
Zwykły literał ciągu składa się z zera lub większej liczby znaków ujętych w podwójne cudzysłowy, jak w przypadku „hello”, i może zawierać zarówno proste sekwencje ucieczki (takie jak \ t dla znaku tabulacji), jak i sekwencje szesnastkowe i sekwencje unikowe Unicode.
Dosłowny literał ciągu składa się ze znaku @, po którym następuje znak podwójnego cudzysłowu, zero lub więcej znaków oraz zamykający znak podwójnego cudzysłowu. Prostym przykładem jest @ "hello". W dosłownym literale ciągu znaki między ogranicznikami są interpretowane dosłownie, a jedynym wyjątkiem jest sekwencja ucieczki cudzysłowu. W szczególności proste sekwencje specjalne oraz sekwencje szesnastkowe i unikowe Unicode nie są przetwarzane w dosłownych literałach łańcuchowych. Dosłowny literał ciągu może obejmować wiele wierszy.
Innymi słowy, jedynym znakiem specjalnym w @ „dosłownym literale ciągu” jest znak podwójnego cudzysłowu. Jeśli chcesz napisać ciąg dosłowny zawierający cudzysłów, musisz wpisać dwa cudzysłowy. Wszystkie inne znaki są interpretowane dosłownie.
Możesz nawet mieć dosłowne nowe wiersze w dosłownym literale ciągu. W zwykłym literale łańcuchowym nie można mieć dosłownych nowych linii. Zamiast tego musisz użyć na przykład "\n"
.
Dosłowne literały ciągów znaków są często przydatne do osadzania nazw plików i wyrażeń regularnych w kodzie źródłowym, ponieważ odwrotne ukośniki w tych typach ciągów są powszechne i trzeba je było zmienić, jeśli został użyty zwykły literał ciągu.
W czasie wykonywania nie ma różnicy między ciągami utworzonymi ze zwykłych literałów ciągów a ciągami utworzonymi z dosłownych literałów ciągów - oba są typu System.String
.
Nie ma różnicy w czasie wykonywania między ciągiem a ciągiem dosłownym. Różnią się tylko w czasie kompilacji. Kompilator akceptuje mniej sekwencji ucieczki w ciągu dosłownym, więc to, co widzisz, jest tym, co otrzymujesz, inne niż cytat.
Możesz również użyć znaku dosłownie @, aby nakazać kompilatorowi traktowanie słowa kluczowego jako nazwy:
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);
Możesz również mieć ciąg wielowierszowy, używając ciągów dosłownych:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
bez @
ciebie pojawił się błąd.
W VB14 jest nowa funkcja o nazwie Multiline Strings
, jest jak ciągi dosłowne w C #.
Wskazówka dla profesjonalistów: literały ciągów VB są teraz dokładnie takie same jak ciągi dosłowne w języku C #.
Zwykłe ciągi używają specjalnych sekwencji ucieczki do tłumaczenia na znaki specjalne.
/*
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\\");
Dosłowne ciągi znaków są interpretowane tak, jak są, bez tłumaczenia żadnych sekwencji ucieczki:
/*
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\\.");