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