Qual é a diferença entre uma sequência regular e uma sequência literal?

166

Eu tenho uma versão de teste do Resharper e isso sempre sugere que eu alterne as seqüências regulares para seqüências textuais. Qual é a diferença?

Xaisoft
fonte
3
Eu nunca vi essa sugestão do ReSharper. Você pode dar um exemplo em que isso sugere?
John Saunders
3
Eu acabei de entender. A primeira sugestão foi movê-lo para um recurso, mas a segunda foi transformá-lo em uma sequência literal: MessageBox.Show ("Um ornitorrinco deve ser acariciado antes que o trabalho possa prosseguir.");
B. Clay Shannon
Eu ainda entendo o tempo todo. Geralmente, é um dos avisos de compartilhamento de compartilhamento que você deseja desativar, porque sugere a criação de strings literalmente sem nenhuma razão.
precisa saber é o seguinte
Se você gosta do meu recurso sugerido para o Visual Studio IDE, atualize aqui: developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

Respostas:

191

Uma string literal é 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 sequência literalmente e não interpreta os caracteres de controle de outra maneira.

alc6379
fonte
12
Eu me pergunto por que o Resharper sugere essa mudança. Algum guru do CLR sabe se as seqüências textuais são processadas com mais eficiência, pois os caracteres de escape podem ser ignorados?
Matt Peterson
9
Eu acho que talvez ReSharper o sugira porque a string literal é mais legível.
22410 andyp
36
Eu acredito que é uma espécie de convenção de codificação (nunca vi ou ouvi antes). Para strings, o ReSharper sugere movê-lo para um arquivo de recursos para localização ou torná-lo textualmente - para strings textuais, o ReSharper não oferece mais a opção de localizar a string. Portanto, parece uma convenção criar todas as strings que não precisam de localização literalmente.
Daniel Brückner
Digamos que tenhamos literal de string atribuído à variável de string, string myFileName = "C: \\ myfolder \\ myfile.txt"; Agora, quero converter a variável de string myFileName em string literal. Como eu faço isso? Isto funciona? string verbatimStr = @myFileName;
sanjeev Bhusal
3
@sanjeevbhusal: Você realmente nunca faz isso. @ "C: \ myfolder \ myfile.txt" e "C: \\ myfolder \\ myfile.txt" são a mesma coisa para o CLR. É apenas açúcar sintático, basicamente.
alc6379
68

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

2.4.4.5 Literais de strings

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

Um literal de cadeia regular consiste em zero ou mais caracteres entre aspas duplas, como em "olá", e pode incluir seqüências de escape simples (como \ t para o caractere de tabulação) e seqüências de escape hexadecimais e Unicode.

Um literal literal de sequência 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 uma cadeia literal literal, os caracteres entre os delimitadores são interpretados literalmente, a única exceção sendo uma sequência de escape de citação. Em particular, seqüências de escape simples e seqüências de escape hexadecimais e Unicode não são processadas em literais de string literal. Um literal literal de cadeia de caracteres pode abranger várias linhas.

Em outras palavras, o único caractere especial em uma "string literal literal" @ é o caractere de aspas duplas. Se você deseja escrever uma sequência literal contendo aspas duplas, escreva duas aspas duplas. Todos os outros caracteres são interpretados literalmente.

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

Literais de cadeias verbais são geralmente úteis para incorporar nomes de arquivos e expressões regulares no código-fonte, porque as barras invertidas nesses tipos de cadeias são comuns e precisariam ser escapadas se uma literal de cadeia regular fosse usada.

Não há diferença no tempo de execução entre as strings criadas a partir de literais regulares e as strings criadas a partir de literais literalmente - elas são do tipo System.String.

Mark Byers
fonte
27

Não há diferença de tempo de execução entre uma sequência e uma sequência literal. Eles são diferentes apenas no momento da compilação. O compilador aceita menos seqüências de escape em uma sequência literal, para que o que você vê seja o que você obtém, exceto um escape de aspas.

Você também pode usar o caractere literal, @, 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);
Março de Corbin
fonte
16

Você também pode ter uma sequência multilinha usando sequências verbatim:

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

sem @você ter um erro.

No VB14, há um novo recurso chamado Multiline Strings, é como seqüências textuais em C #.

Cordas multilinhas

Dica profissional: os literais de cadeia de caracteres VB agora são exatamente como as seqüências verbais em C #.

Mohamad Shiralizadeh
fonte
13

Sequências regulares usam seqüê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 verbais são interpretadas como estão, sem traduzir nenhuma sequência 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\\.");
BoltClock
fonte
0

Se você deseja remover os avisos do Resharper, pode usar:

Localizable(false)

Para coisas como parâmetros, locais de arquivos, por exemplo. Essa poderia ser uma boa solução.

E você
fonte