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