В чем разница между регулярной строкой и стенографической строкой?

У меня есть пробная версия 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 для символа табуляции), так и шестнадцатеричные и Unicode escape-последовательности.

Строковый литерал строки состоит из символа @, за которым следует символ двойной кавычки, ноль или более символов и символ закрывающей двойной кавычки. Простым примером является @ «привет». В стенографическом строковом литерале символы между разделителями интерпретируются дословно, единственным исключением является последовательность escape-котировки. В частности, простые escape-последовательности и шестнадцатеричные и Unicode escape-последовательности не обрабатываются в стенографических строковых литералах. Вербальный строковый литерал может охватывать несколько строк.

Другими словами, единственным специальным символом в @ “стенографическом строковом литерале” является символ двойной кавычки. Если вы хотите написать стенографическую строку, содержащую двойную кавычку, вы должны написать две двойные кавычки. Все остальные символы интерпретируются буквально.

Вы можете даже иметь буквальные новые строки в стенографическом литерале. В регулярном строковом литерале вы не можете иметь буквальные новые строки. Вместо этого вы должны использовать, например, "\n" .

Литералы строк Verbatim часто полезны для встраивания имен файлов и регулярных выражений в исходный код, поскольку обратные косые черты в этих типах строк являются общими и должны быть экранированы, если бы использовался обычный строковый литерал.

Нет никакой разницы во времени выполнения между строками, созданными из регулярных строковых литералов и строк, созданных из стенографических литералов – они оба типа System.String .

Между строкой и стенографической строкой не существует разницы во времени выполнения. Они только разные во время компиляции. Компилятор принимает меньшее количество последовательностей escape-последовательности в стенографической строке, поэтому что-вы-видите-есть-что-вы-получите, кроме 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 #.

Многострочные струны

Pro tip: Строковые литералы VB теперь точно такие же, как строки С #.

В обычных строках используются специальные 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\\."); 
  • Каковы некоторые альтернативы ReSharper?
  • Resharper запускает UnitTest из другого места
  • Давайте будем гением компьютера.