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?
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?
Respostas:
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.
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
.
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);
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 #.
Dica profissional: os literais de cadeia de caracteres VB agora são exatamente como as seqüências verbais em C #.
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\\.");