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