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.
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.
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 nameConsole.WriteLine(@if);//compiler err, if without @ is a keywordConsole.WriteLine(if);var@a="a";//okayConsole.WriteLine(@a);//also okay, @ isn't part of the nameConsole.WriteLine(a);
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\\.");
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.
fonte
Isso é abordado na seção 2.4.4.5 da especificação C # :
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
.fonte
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:
fonte
Você também pode ter uma sequência multilinha usando sequências verbatim:
sem
@
você ter um erro.No VB14, há um novo recurso chamado
Multiline Strings
, é como seqüências textuais em C #.fonte
Sequências regulares usam seqüências de escape especiais para traduzir para caracteres especiais.
Cadeias verbais são interpretadas como estão, sem traduzir nenhuma sequência de escape:
fonte
Se você deseja remover os avisos do Resharper, pode usar:
Para coisas como parâmetros, locais de arquivos, por exemplo. Essa poderia ser uma boa solução.
fonte