No .NET, qual é a diferença entre String.Empty
e ""
, e eles são intercambiáveis, ou há alguns problemas subjacentes de referência ou Localização em torno da igualdade que String.Empty
garantirão que não sejam um problema?
.net
double-quotes
string
johnc
fonte
fonte
string.Empty
e qual foi a lógica por trás de declará-la como emreadonly
vez deconst
.Respostas:
No .NET anterior à versão 2.0,
""
cria um objeto enquantostring.Empty
não cria ref de objeto , o que tornastring.Empty
mais eficiente.Na versão 2.0 e posterior do .NET, todas as ocorrências de
""
referem-se à mesma string literal, o que significa que""
é equivalente a.Empty
, mas ainda não tão rápido quanto.Length == 0
..Length == 0
é a opção mais rápida, mas.Empty
para um código um pouco mais limpo.Consulte a especificação do .NET para obter mais informações .
fonte
string.IsNullOrEmpty( stringVar )
.string.Empty
é um campo somente leitura, enquanto""
é uma constante de tempo de compilação. Os locais onde eles se comportam de maneira diferente são:Valor padrão do parâmetro em C # 4.0 ou superior
Expressão de caso na instrução switch
Argumentos de atributo
fonte
String.Empty
como argumento na maioria dos casos. Você está certo que todos os exemplos mostram issoyou simply can't put a (run-time) "value" into (compile-time) metadata
e é isso que os exemplos pretendem mostrar.As respostas anteriores estavam corretas para o .NET 1.1 (veja a data da postagem que eles vincularam: 2003). A partir do .NET 2.0 e posterior, não há essencialmente nenhuma diferença. O JIT acabará referenciando o mesmo objeto no heap de qualquer maneira.
De acordo com a especificação C #, seção 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx
Alguém até menciona isso nos comentários do post de Brad Abram
Em resumo, o resultado prático de "" vs. String.Empty é nulo. O JIT descobrirá isso no final.
Descobri, pessoalmente, que o JIT é muito mais inteligente do que eu e, por isso, tento não ficar muito esperto com otimizações de micro-compiladores como essa. O JIT se desdobra para loops (), remove código redundante, métodos em linha, etc. melhor e em momentos mais apropriados do que eu ou o compilador C # jamais poderia antecipar antes. Deixe o JIT fazer seu trabalho :)
fonte
String.Empty
é um campo somente leitura enquanto""
é uma const . Isso significa que você não pode usarString.Empty
em uma instrução switch porque não é uma constante.fonte
default
palavra-chave que pode promover a leitura, sem, impedir a modificação acidental, e tem uma constante de tempo de compilação, embora para ser honesto, eu ainda acho String.Empty é mais legível do que padrão, mas mais lento para digitarOutra diferença é que String.Empty gera um código CIL maior. Embora o código para referenciar "" e String.Empty tenha o mesmo comprimento, o compilador não otimiza a concatenação de strings (consulte a publicação no blog de Eric Lippert ) para obter os argumentos String.Empty. As seguintes funções equivalentes
gerar essa IL
fonte
"bar " + (ok ? "" : "error")
As respostas acima são tecnicamente corretas, mas o que você realmente deseja usar, para melhor legibilidade do código e menor chance de exceção, é String.IsNullOrEmpty (s)
fonte
--foo=$BAR
, provavelmente deseja identificar a diferença entre eles esquecerem de definir uma var env e eles não passarem o sinalizador.string.IsNullOrEmpty
geralmente é um cheiro de código que você não validou suas entradas corretamente ou está fazendo coisas estranhas. Geralmente, você não deve aceitar cadeias de caracteres vazias quando realmente deseja usarnull
, ou algo como o tipo Talvez / Opção.Costumo usar
String.Empty
mais do que""
por um motivo simples, mas não óbvio:""
e""
NÃO é o mesmo, o primeiro tem 16 caracteres de largura zero. Obviamente, nenhum desenvolvedor competente colocará zero caracteres de largura em seu código, mas se eles chegarem lá, pode ser um pesadelo de manutenção.Notas:
Eu usei U + FEFF neste exemplo.
Não tenho certeza se o SO vai comer esses caracteres, mas tente você mesmo com um dos muitos caracteres de largura zero
Só me deparei com isso graças a https://codegolf.stackexchange.com/
fonte
Use em
String.Empty
vez de""
.Referência:
String.Empty
vs""
fonte
String.Empty não cria um objeto, enquanto "" cria. A diferença, como apontado aqui , é trivial, no entanto.
fonte
Todas as instâncias de "" são iguais, literal de cadeia interna (ou deveriam ser). Então você realmente não estará lançando um novo objeto na pilha toda vez que usar "", mas apenas criando uma referência ao mesmo objeto interno. Dito isto, eu prefiro string.Empty. Eu acho que torna o código mais legível.
fonte
Isso não importa!
Algumas discussões anteriores sobre isso:
http://www.codinghorror.com/blog/archives/000185.html
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx
http://blogs.msdn.com/brada/archive/2003/04/27/50014.aspx
fonte
ldstr
envia uma nova referência de objeto a um literal de seqüência de caracteres armazenado nos metadados.ldsfld
coloca o valor de um campo estático na pilha de avaliaçãoEu tendem a usar em
String.Empty
vez de""
porque IMHO é mais claro e menos VB-ish.fonte
Aqui estão alguns resultados do Roslyn x64 a partir de janeiro de 2019. Apesar das observações consensuais das outras respostas nesta página, não me parece que o JIT x64 atual esteja tratando todos esses casos de forma idêntica, quando tudo estiver dito e feito.
Observe, em particular, que apenas um desses exemplos acaba chamando
String.Concat
, e acho que isso é por motivos obscuros de correção (em oposição a uma supervisão de otimização). As outras diferenças parecem mais difíceis de explicar.default (String) + {default (String), "", String.Empty}
"" + {padrão (String), "", String.Empty}
String.Empty + {padrão (String), "", String.Empty}
Detalhes do teste
fonte
Chegando a isso do ponto de vista do Entity Framework: o EF versões 6.1.3 parece tratar String.Empty e "" de maneira diferente ao validar.
string.Empty é tratado como um valor nulo para fins de validação e lançará um erro de validação se for usado em um campo Obrigatório (atribuído); onde como "" passará na validação e não lançará o erro.
Esse problema pode ser resolvido no EF 7+. Referência: - https://github.com/aspnet/EntityFramework/issues/2610 ).
Edit: [Required (AllowEmptyStrings = true)] resolverá esse problema, permitindo que string.Empty seja validada.
fonte
Como String.Empty não é uma constante em tempo de compilação, você não pode usá-lo como um valor padrão na definição de função.
fonte
public void test(int i=0, string s=string.Empty) {}
não irá compilar e dizer "valor do parâmetro padrão para 's' deve ser uma constante em tempo de compilação obras resposta do OP..Quando você digitaliza visualmente o código, "" aparece colorido da maneira que as strings são coloridas. string.Empty se parece com um acesso de membro de classe regular. Durante uma rápida olhada, é mais fácil identificar "" ou intuir o significado.
Identifique as strings (a colorização do estouro de pilha não ajuda exatamente, mas no VS isso é mais óbvio):
fonte
\u00ad
.Todo mundo aqui deu um bom esclarecimento teórico. Eu tinha uma dúvida semelhante. Então, eu tentei uma codificação básica nele. E eu achei a diferença. Aqui está a diferença.
Parece que "Nulo" significa absolutamente nulo e "String.Empty" significa que contém algum tipo de valor, mas está vazio.
fonte
""
versusstring.Empty
. Somente ao tentar dizer se a string está vazia,null
foi mencionado.