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



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

522   5  

5 ответов:

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

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

будет

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

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

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

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

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

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

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

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

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

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

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

Multiline Strings

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

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

Comments

    Ничего не найдено.