Em C #, quero inicializar um valor de sequência com uma sequência vazia.
Como devo fazer isso? Qual é o caminho certo e por quê?
string willi = string.Empty;
ou
string willi = String.Empty;
ou
string willi = "";
ou o que?
c#
.net
string
initialization
Daniel Kreiseder
fonte
fonte
Respostas:
Use o que você e sua equipe acharem mais legíveis.
Outras respostas sugeriram que uma nova string seja criada toda vez que você usar
""
. Isso não é verdade - devido à internação de strings, ele será criado uma vez por assembly ou uma vez por AppDomain (ou possivelmente uma vez para todo o processo - não tenho certeza dessa parte da frente). Essa diferença é insignificante - massivamente, massivamente insignificante.Porém, o que você acha mais legível é uma questão diferente. É subjetivo e varia de pessoa para pessoa. Por isso, sugiro que você descubra como a maioria das pessoas da sua equipe gosta e que tudo isso seja consistente. Pessoalmente, acho
""
mais fácil ler.O argumento de que
""
e" "
é facilmente confundido com o outro realmente não lavar comigo. A menos que você esteja usando uma fonte proporcional (e eu não trabalhei com nenhum desenvolvedor que o faça), é muito fácil perceber a diferença.fonte
string.Empty
não é uma constante . Isso significa que em vários casos em que é necessária uma constante em tempo de compilação,string.Empty
isso nem é legal. Isso incluicase ""
blocos emswitch
instruções, valores padrão de parâmetros opcionais , parâmetros e propriedades na aplicação de atributos e muitas outras situações (deixadas para o leitor). Portanto, considerando que issostring.Empty
não é permitido em algumas situações comuns, é melhor usar a""
convenção -everywhere.Realmente não há diferença do ponto de vista de desempenho e código gerado. Nos testes de desempenho, eles iam e voltavam entre os quais era mais rápido do que o outro e apenas em milissegundos.
Ao olhar para o código dos bastidores, você também não vê nenhuma diferença. A única diferença está no IL, que
string.Empty
usa o opcodeldsfld
e""
o opcodeldstr
, mas isso é apenas porquestring.Empty
é estático, e as duas instruções fazem a mesma coisa. Se você observar a montagem produzida, é exatamente a mesma.Código C #
Código IL
Código de montagem
fonte
O melhor código é nenhum código :
Consequentemente, menos código é melhor código: Prefere
""
aostring.Empty
ouString.Empty
. Essas duas são seis vezes mais sem benefícios adicionais - certamente sem clareza adicional, pois expressam exatamente as mesmas informações.fonte
i
é melhor que um nome de variável longo. Ainda mais gerais, nomes de variáveis mais curtos que transmitem a mesma informação , com a mesma clareza, são sempre preferíveis. É só que, para expressar as informações necessárias, você precisa de um certo comprimento de caractere e não estou negando isso (ninguém está).Uma diferença é que, se você usa uma
switch-case
sintaxe, não pode escrevercase string.Empty:
porque não é uma constante. Você recebe umCompilation error : A constant value is expected
Veja este link para obter mais informações: string-empty-versus-empty-quotes
fonte
switch
afirmação é um exemplo muito bom. Além disso, se você criar um parâmetro opcional, comovoid MyMethod(string optional = "") { ... }
, também não será possível usá-lostring.Empty
. E, claro, se você deseja definir umconst
campo ou variável local,const string myString = "";
novamente""
a única opção. Se ao menosstring.Empty
houvesse um campo constante, não haveria diferença. Mas não é, então, em alguns casos, você precisa usar""
. Então, por que não usar""
o tempo todo?string.Empty
impede que você consiga consistência em sua base de código: você deve usar duas entidades diferentes para expressar a mesma coisa. E para adicionar à lista de coisas que você não pode fazer: você não pode usarstring.Empty
com atributos .Eu prefiro
string
aString
. escolherstring.Empty
sobre""
é uma questão de escolher um e ficar com ele. A vantagem de usarstring.Empty
é que é muito óbvio o que você quer dizer, e você não copia acidentalmente caracteres não imprimíveis como"\x003"
no seu""
.fonte
""
é perigoso quando copiar / colar é nulo, afirmo, porque você nunca copia / cola a string vazia. Para outras strings, é sempre algo para se estar atento, é claro.Eu não iria gritar, mas estou vendo algumas informações erradas sendo jogadas aqui.
Eu, pessoalmente, prefiro
string.Empty
. Essa é uma preferência pessoal, e eu me inclino à vontade de qualquer equipe com quem eu trabalhe, caso a caso.Como alguns outros mencionaram, não há diferença entre
string.Empty
eString.Empty
.Além disso, e esse é um fato pouco conhecido, usar "" é perfeitamente aceitável. Todas as instâncias de "" criarão um objeto em outros ambientes. No entanto, o .NET armazena suas seqüências de caracteres, portanto, as instâncias futuras extrairão a mesma sequência imutável do pool de estagiários e qualquer ocorrência de desempenho será insignificante. Fonte: Brad Abrams .
fonte
Eu pessoalmente prefiro "" a menos que haja uma boa razão para algo mais complexo.
fonte
String.Empty
estring.Empty
são equivalentes.String
é o nome da classe BCL;string
é o alias do C # (ou atalho, se você desejar). O mesmo que comInt32
eint
. Veja os documentos para mais exemplos.No que diz
""
respeito, não tenho muita certeza.Pessoalmente, eu sempre uso
string.Empty
.fonte
Quase todos os desenvolvedores sabem o que significa "". Eu pessoalmente encontrei o String.Empty pela primeira vez e tive que gastar algum tempo pesquisando no google para descobrir se eles realmente são exatamente a mesma coisa.
fonte
string.Empty
? Você sabia qual""
foi a primeira vez que viu?Esse tópico é bastante antigo e longo, com licença, se esse comportamento tiver sido mencionado em outro lugar. (E me aponte para a resposta que cobre isso)
Eu encontrei uma diferença no comportamento do compilador se você usar
string.Empty
ou aspas duplas. A diferença é exibida se você não usar a variável string inicializada com string.Empty ou com aspas duplas.Em caso de inicialização com
string.Empty
o Aviso do Compiladornunca é emitido enquanto, no caso de inicialização com aspas duplas, você obtém a mensagem esperada.
Esse comportamento é explicado no artigo Conectar neste link: https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value
Basicamente, se eu entendi direito, eles querem permitir que um programador defina uma variável com o valor de retorno de uma função para fins de depuração sem incomodá-lo com uma mensagem de aviso, limitando o aviso apenas no caso de atribuições e seqüências de caracteres dispendiosas. Vazio não é uma constante, mas um campo.
fonte
var unused = "literal";
pode ser completamente otimizada (removida) pelo compilador. Não pode ter efeitos colaterais. Por outro lado,var unused = MyClass.Member;
não pode ser removido completamente. Isso ocorre porque a leituraMember
pode ter efeitos colaterais. SeMember
for uma propriedade estática com umget
acessador, é claro que a chamada para o getter deve ser mantida. Mas mesmo queMember
seja um campo estático, pode haver o efeito colateral que o construtor estático pode executar. Claro que seria um estilo ruim de codificação tê-lo dessa maneira. Mas você precisa de um boneco para lerMember
.Eu executei esse teste muito simples usando o seguinte método em um aplicativo de console:
Isso sugere claramente que as três variáveis
str1
, a saber ,str2
estr3
embora sejam inicializadas usando sintaxe diferente, estão apontando para o mesmo objeto de string (de comprimento zero) na memória. Eu executei este teste no aplicativo de console .NET 4.5. Portanto, internamente, eles não têm diferença e tudo se resume à conveniência de qual você deseja usar como programador. Esse comportamento da classe de string é conhecido como interning de string no .NET. Eric Lippert tem um blog muito bom aqui descrevendo esse conceito.fonte
Qualquer uma das anteriores.
Há muitas, muitas coisas melhores para pontificar. Como a cor da casca que melhor se adapta a uma árvore, acho que marrom vago com reflexos de musgo doce.
fonte
Eu prefiro o String.Empty, além dos outros motivos para garantir que você saiba o que é e que não removeu acidentalmente o conteúdo, mas principalmente para a internacionalização. Se eu vejo uma string entre aspas, sempre tenho que me perguntar se esse código é novo e deve ser colocado em uma tabela de strings. Então, toda vez que o código é alterado / revisado, você precisa procurar "algo entre aspas" e sim, pode filtrar as cadeias vazias, mas digo às pessoas que é uma boa prática nunca colocar cadeias entre aspas, a menos que você saiba que não será localizado .
fonte
Ninguém mencionou que no VisualStudio String o código de cores é diferente do que o string. O que é importante para facilitar a leitura. Além disso, letras minúsculas geralmente são usadas para vars e tipo, não um grande problema, mas String.Empty é uma constante e não uma var ou tipo.
fonte
string
é sinônimo deSystem.String
tipo, eles são idênticos.Os valores também são idênticos:
string.Empty == String.Empty == ""
Eu não usaria constantes de caracteres "" no código,
string.Empty
ouString.Empty
- mais fácil ver o que significava programador.Entre
string
eString
eu gosto mais de letras minúsculas,string
só porque eu costumava trabalhar com Delphi por muitos anos e o estilo Delphi é minúsculostring
.Então, se eu fosse seu chefe, você estaria escrevendo
string.Empty
fonte
Eu seria a favor de
string.Empty
maisString.Empty
porque você pode usá-lo sem a necessidade de incluir umusing System;
no seu arquivo.Como para a colheita
""
maisstring.Empty
, é preferência pessoal e deve ser decidida por sua equipe.fonte
string.Empty
constante sem importar ousing System
espaço para nome - as palavras-chave em C # simplesmente são convertidas em seu nome completo, que inclui o espaço para nome antes de serem gravadas como MSIL na saída * .dll ou *. arquivo exe. Tão eficazmentestring.Empty
é escrito comoSystem.String.Empty
no MSIL pelo compilador. E como você já deve saber, se mencionar o nome completo do tipo, poderá ignorar a importação de espaços para nome na parte superior do seu arquivo de código.Eu não faço diferença. O último é o mais rápido de digitar :)
fonte
Não importa - eles são exatamente a mesma coisa. No entanto, o principal é que você deve ser consistente
ps Luto com esse tipo de "qual é a coisa certa" o tempo todo.
fonte
É totalmente uma preferência de estilo de código, como o .NET lida com seqüências de caracteres. No entanto, aqui estão as minhas opiniões :)
Eu sempre uso os nomes de tipo BCL ao acessar métodos, propriedades e campos estáticos:
String.Empty
ouInt32.TryParse(...)
ouDouble.Epsilon
Eu sempre uso as palavras-chave C # ao declarar novas instâncias:
int i = 0;
oustring foo = "bar";
Eu raramente uso literais de cadeia não declarada, pois gosto de poder escanear o código para combiná-lo em constantes nomeadas reutilizáveis. O compilador substitui as constantes pelos literais de qualquer maneira, portanto é mais uma maneira de evitar números / seqüências mágicas e dar um pouco mais de significado a elas com um nome. Além disso, alterar os valores é mais fácil.
fonte
Eu uso o terceiro, mas dos outros dois o primeiro parece menos estranho. string é um alias para String, mas vê-los em uma atribuição parece errado.
fonte
Qualquer um dos dois primeiros seria aceitável para mim. Eu evitaria o último, porque é relativamente fácil introduzir um erro, colocando um espaço entre as aspas. Este bug em particular seria difícil de encontrar por observação. Supondo que não haja erros de digitação, todos são semanticamente equivalentes.
[EDITAR]
Além disso, você pode sempre usar uma
string
ou outraString
consistência, mas sou apenas eu.fonte
Eu testemunhei pessoalmente "" resultando em problemas (menores) duas vezes. Uma vez foi devido a um erro de um desenvolvedor júnior novo na programação baseada em equipes, e o outro foi um erro de digitação simples, mas o fato é o uso de string.Empty teria evitado os dois problemas.
Sim, essa é uma decisão de julgamento, mas quando um idioma oferece várias maneiras de fazer as coisas, eu tendem a me inclinar para aquele que tem a supervisão mais compiladora e a execução mais forte em tempo de compilação. Isso não é "". É tudo uma questão de expressar intenção específica.
Se você digitar string.EMpty ou Strng.Empty, o compilador informa que você fez isso errado. Imediatamente. Simplesmente não será compilado. Como desenvolvedor, você está citando assuntos específicos. intenção que o compilador (ou outro desenvolvedor) não possa interpretar mal de forma alguma e, quando você faz isso errado, não pode criar um bug.
Se você digitar "" quando quiser "" ou vice-versa, o compilador fará o que você pediu. Outro desenvolvedor pode ou não conseguir coletar sua intenção específica. Bug criado.
Muito antes da string.Empty, usei uma biblioteca padrão que definia a constante EMPTY_STRING. Ainda usamos essa constante nas instruções de caso em que string.Empty não é permitido.
Sempre que possível, coloque o compilador para trabalhar para você e elimine a possibilidade de erro humano, por menor que seja. Na IMO, isso supera a "legibilidade", como outros já citaram.
Especificidade e tempo de compilação. É o que tem para o jantar.
fonte
Eu uso "" porque será colorido em amarelo no meu código ... por algum motivo, String.Empty é todo branco no meu tema do Visual Studio Code. E acredito que isso é o mais importante para mim.
fonte
O compilador deve torná-los iguais a longo prazo. Escolha um padrão para que seu código seja fácil de ler e fique com ele.
fonte
Eu estava apenas olhando para algum código e essa pergunta surgiu em minha mente, que eu já havia lido algum tempo antes. Esta é certamente uma questão de legibilidade.
Considere o seguinte código C # ...
vs
Pessoalmente, acho o último menos ambíguo e mais fácil de ler.
Como apontado por outros, as diferenças reais são insignificantes.
fonte
Acho que o segundo é "adequado", mas para ser sincero, não acho que isso importe. O compilador deve ser inteligente o suficiente para compilar qualquer um deles exatamente no mesmo bytecode. Eu uso "" eu mesmo.
fonte
Embora a diferença seja muito, MUITO pequena, a diferença ainda existe.
1) "" cria um objeto enquanto String.Empty não. Mas este objeto será criado uma vez e será referenciado a partir do conjunto de cadeias posteriormente, se você tiver outro "" no código.
2) String e string são as mesmas, mas eu recomendaria usar String.Empty (assim como String.Format, String.Copy etc.), pois a notação de ponto indica classe, não operador, e a classe que começa com letra maiúscula está em conformidade com Padrões de codificação em C #.
fonte
Em http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx :
fonte
A cadeia vazia é como um conjunto vazio, apenas um nome que todo mundo usa para chamar
""
. Também em linguagens formais, as strings criadas a partir de um alfabeto com comprimento zero são chamadas de strings vazias. O conjunto e a sequência possuem um símbolo especial. Cadeia vazia: ε e conjunto vazio: ∅. Se você quiser falar sobre essa string de comprimento zero, você a chamará de string vazia, para que todos saibam exatamente a que você está se referindo. Agora, caso você o nomeie como uma string vazia, por que não usarstring.Empty
no código, isso mostra que a intenção é explícita. A desvantagem é que não é uma constante e, portanto, não está disponível em todos os lugares, como nos atributos. (Não é uma constante por alguns motivos técnicos, consulte a fonte de referência.)fonte
Eu prefiro
""
porque é mais curto eString.Empty
resolve um problema que não existe.fonte