В чем разница между обычной строкой и дословной строкой? - PullRequest
153 голосов
/ 22 июля 2010

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

Ответы [ 5 ]

172 голосов
/ 22 июля 2010

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

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

будет

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

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

64 голосов
/ 22 июля 2010

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

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

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

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

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

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

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

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

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

24 голосов
/ 22 июля 2010

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

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

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);
15 голосов
/ 11 декабря 2014

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

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

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

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

Multiline Strings

Совет для профессионала: строковые литералы VB теперь в точности соответствуют дословным строкам C #.

12 голосов
/ 22 июля 2010

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

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

/* 
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\\.");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...