Каково различие между обычной строкой и дословной строкой?

У меня есть пробная версия Resharper, и он всегда предлагает, чтобы я переключил обычные строки на дословные строки. Каково различие?

156
задан ricksmt 14 April 2016 в 20:26
поделиться

4 ответа

Дословная строка - это строка, которую не нужно экранировать, например имя файла:

string myFileName = "C: \\ myfolder \\ myfile.txt";

будет be

string myFileName = @ "C: \ myfolder \ myfile.txt";

Символ @ означает буквально читать эту строку и не интерпретировать управляющие символы в противном случае.

177
ответ дан 23 November 2019 в 21:50
поделиться

Это рассматривается в разделе 2.4.4.5 спецификации C#:

2.4.4.5 Строковые литералы

C# поддерживает две формы строковых литералов: обычные строковые литералы и дословные строковые литералы.

Обычный строковый литерал состоит из нуля или более символов, заключенных в двойные кавычки, как в слове "hello", и может включать как простые управляющие последовательности (например, \t для символа табуляции), так и шестнадцатеричные и юникодные управляющие последовательности.

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

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

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

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

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

65
ответ дан 23 November 2019 в 21:50
поделиться

Обычные строки используют специальные управляющие последовательности для перевода в специальные символы.

/*
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\\.");
13
ответ дан 23 November 2019 в 21:50
поделиться

Нет никакой разницы во времени выполнения между строкой и дословной строкой. Они различаются только во время компиляции. Компилятор принимает меньше управляющих последовательностей в строке, так что что видите, то и получаете, кроме кавычек.

Вы также можете использовать символ @, чтобы указать компилятору рассматривать ключевое слово как имя:

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);
25
ответ дан 23 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: