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

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


person Xaisoft    schedule 22.07.2010    source источник
comment
Я никогда не видел такого предложения от ReSharper. Вы можете привести пример, где это предполагает?   -  person John Saunders    schedule 22.07.2010
comment
Я только что понял. Первое предложение заключалось в том, чтобы переместить его в ресурс, но второе - сделать его дословной строкой: MessageBox.Show (утконоса необходимо погладить, прежде чем можно будет продолжить работу);   -  person B. Clay Shannon    schedule 29.10.2014
comment
Я до сих пор получаю это все время. Как правило, это одно из предупреждений resharper, которые вы хотите отключить, потому что оно предлагает сделать строки дословно без какой-либо причины.   -  person Dean Swiatek    schedule 01.03.2018
comment
Если вам нравится предложенная мной функция для среды разработки Visual Studio, проголосуйте здесь: developercommunity.visualstudio.com/idea/602807/   -  person Olivier Jacot-Descombes    schedule 16.08.2019


Ответы (6)


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

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

было бы

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

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

person alc6379    schedule 22.07.2010
comment
Интересно, почему Решарпер предлагает это изменение. Знают ли какие-либо гуру CLR, что дословные строки обрабатываются более эффективно, поскольку escape-символы можно игнорировать? - person Matt Peterson; 22.07.2010
comment
Я думаю, что, возможно, ReSharper предлагает это, потому что дословная строка более читабельна. - person andyp; 22.07.2010
comment
Я считаю, что это своего рода соглашение о кодировании (я никогда раньше не видел и не слышал). Для строк ReSharper предлагает либо переместить его в файл ресурсов для локализации, либо сделать его дословным - для дословных строк ReSharper больше не предлагает возможность локализации строки. Таким образом, это похоже на соглашение, согласно которому все строки, которые не нуждаются в локализации, являются дословными. - person Daniel Brückner; 22.07.2010

Это описано в разделе 2.4.4.5 спецификации C # < / а>:

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

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

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

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

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

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

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

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

person Mark Byers    schedule 22.07.2010

Между строкой и дословной строкой нет разницы во времени выполнения. Они отличаются только во время компиляции. Компилятор принимает меньше 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);
person Corbin March    schedule 22.07.2010

У вас также может быть многострочная строка, используя дословные строки:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

без @ вы получили ошибку.

В VB14 есть новая функция под названием Multiline Strings, она похожа на дословные строки в C #.

Многострочные строки

Совет от профессионала: строковые литералы VB теперь точно такие же, как буквальные строки C #.

person Mohamad Shiralizadeh    schedule 11.12.2014

Обычные строки используют специальные 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\\");

Дословные строки интерпретируются как есть, без перевода каких-либо управляющих последовательностей:

/* 
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\\.");
person BoltClock    schedule 22.07.2010

Если вы хотите подавить предупреждения ReSharper, вы можете использовать:

Localizable(false)

Для таких вещей, как параметры, расположение файлов и т. Д., Это может быть хорошим решением.

person AndyO    schedule 15.01.2020