У меня есть пробная версия ReSharper, и она всегда предлагает мне переключить обычные строки на дословные. В чем разница?
В чем разница между обычной строкой и дословной строкой?
Ответы (6)
Дословная строка - это строка, которую не нужно экранировать, например имя файла:
string myFileName = "C:\\myfolder\\myfile.txt";
было бы
string myFileName = @"C:\myfolder\myfile.txt";
Символ @ означает, что эту строку следует читать буквально и иначе не интерпретировать управляющие символы.
Это описано в разделе 2.4.4.5 спецификации C # < / а>:
2.4.4.5 Строковые литералы
C # поддерживает две формы строковых литералов: обычные строковые литералы и дословные строковые литералы.
Обычный строковый литерал состоит из нуля или более символов, заключенных в двойные кавычки, как в hello, и может включать как простые escape-последовательности (например, \ t для символа табуляции), так и шестнадцатеричные escape-последовательности и escape-последовательности Unicode.
Дословный строковый литерал состоит из символа @, за которым следует символ двойной кавычки, ноль или более символов и закрывающий символ двойной кавычки. Простой пример - @hello. В дословном строковом литерале символы между разделителями интерпретируются дословно, единственным исключением является escape-последовательность кавычек. В частности, простые escape-последовательности и escape-последовательности в шестнадцатеричном формате и Unicode не обрабатываются в дословных строковых литералах. Дословный строковый литерал может занимать несколько строк.
Другими словами, единственным специальным символом в строковом литерале @verbatim является символ двойной кавычки. Если вы хотите написать дословную строку, содержащую двойные кавычки, вы должны написать две двойные кавычки. Все остальные персонажи трактуются буквально.
У вас даже могут быть буквальные новые строки в буквальном строковом литерале. В обычном строковом литерале не может быть буквальных новых строк. Вместо этого вы должны использовать, например, "\n"
.
Дословные строковые литералы часто полезны для встраивания имен файлов и регулярных выражений в исходный код, потому что обратная косая черта в этих типах строк является обычным явлением и должна быть экранирована, если использовался обычный строковый литерал.
Во время выполнения нет разницы между строками, созданными из обычных строковых литералов, и строками, созданными из буквальных строковых литералов - они оба имеют тип System.String
.
Между строкой и дословной строкой нет разницы во времени выполнения. Они отличаются только во время компиляции. Компилятор принимает меньше escape-последовательностей в дословной строке, поэтому «что-то-вид-то-то-то-получишь», кроме экранирования кавычек.
Вы также можете использовать дословный символ @, чтобы указать компилятору обрабатывать ключевое слово как имя:
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);
У вас также может быть многострочная строка, используя дословные строки:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
без @
вы получили ошибку.
В VB14 есть новая функция под названием Multiline Strings
, она похожа на дословные строки в C #.
Совет от профессионала: строковые литералы VB теперь точно такие же, как буквальные строки C #.
Обычные строки используют специальные escape-последовательности для преобразования в специальные символы.
/*
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\\");
Дословные строки интерпретируются как есть, без перевода каких-либо управляющих последовательностей:
/*
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\\.");
Если вы хотите подавить предупреждения ReSharper, вы можете использовать:
Localizable(false)
Для таких вещей, как параметры, расположение файлов и т. Д., Это может быть хорошим решением.