Qual é a diferença entre uma string regular e uma string textual?

Eu tenho uma versão de avaliação do resharper e sempre sugere que eu alterne as seqüências de caracteres regulares para seqüências de caracteres verbatim. Qual é a diferença?

   

    Uma string textual é aquela que não precisa ser escapada, como um nome de arquivo:

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

    seria

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

    O símbolo @ significa ler essa string literalmente e não interpretar os caracteres de controle de outra forma.

    Isso é abordado na seção 2.4.4.5 da especificação do C # :

    2.4.4.5 Literais de string

    O C # suporta duas formas de literais de string: literais de string regulares e literais de string literais.

    Um literal de string regular consiste em zero ou mais caracteres entre aspas duplas, como em “hello”, e pode include tanto sequências de escape simples (como \ t para o caractere de tabulação) quanto seqüências de escape hexadecimais e Unicode.

    Um literal de cadeia literal consiste em um caractere @ seguido por um caractere de aspas duplas, zero ou mais caracteres e um caractere de aspas duplas de fechamento. Um exemplo simples é @ “olá”. Em um literal de cadeia literal, os caracteres entre os delimitadores são interpretados literalmente, a única exceção é uma seqüência de escape de cotação. Em particular, seqüências de escape simples e sequências de escape hexadecimais e Unicode não são processadas em literais de cadeia literal. Um literal de cadeia literal pode abranger várias linhas.

    Em outras palavras, o único caractere especial em um “literal literal da string” é o caractere de aspas duplas. Se você deseja escrever uma string textual contendo uma aspa dupla, você deve escrever duaspas duplas. Todos os outros personagens são interpretados literalmente.

    Você pode até mesmo ter novas linhas literais em uma literal string literal. Em um literal de string regular, você não pode ter novas linhas literais. Em vez disso você deve usar por exemplo "\n" .

    Geralmente, os literais de strings verbatim são úteis para incorporar nomes de arquivos e expressões regulares no código-fonte, porque as barras invertidas nesses tipos de strings são comuns e precisariam ser escapadas se um literal de string regular fosse usado.

    Não há diferença no tempo de execução entre strings criadas a partir de literais e strings de string regulares criados a partir de literais de string literais – ambos são do tipo System.String .

    Não há diferença de tempo de execução entre uma string e uma string textual. Eles são diferentes apenas em tempo de compilation. O compilador aceita menos seqüências de escape em uma string textual, então o que você vê é o que você obtém diferente de um escape de aspas.

    Você também pode usar o caractere textual, @, para dizer ao compilador para tratar uma palavra-chave como um nome:

     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); 

    Você também pode ter cadeias multilinhas usando cadeias verbatim:

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

    sem @ você tem um erro.

    No VB14 existe um novo recurso chamado Multiline Strings , é como as strings textuais em C #.

    Cordas Multiline

    Pro dica: literais de seqüência de caracteres VB agora são exatamente como seqüências de caracteres C # textuais.

    Seqüências regulares usam sequências de escape especiais para traduzir para caracteres especiais.

     /* 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\\"); 

    Cadeias verbatim são interpretadas como estão, sem traduzir quaisquer seqüências de 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\\.");