Qual é o ponto da string.Empty property

35

Por que a propriedade string foo = string.Empty foi incluída na BCL? Parece mais detalhado e não é mais claro do que apenas usar uma string vazia ( string foo = "" )

    
por Tom Squires 17.01.2012 / 18:36
fonte

4 respostas

55

Eu só posso supor aqui:

string.Empty foi definido para explicitação - ao inicializar uma string, pode não estar claro no contexto que "" foi explicitamente definido como um inicializador (em vez de null ou " " ou apenas como espaço reservado durante o teste). Usar string.Empty é uma resposta definitiva para esse tipo de enigma.

Também pode ser um retrocesso para C - uma string vazia em C não é uma string vazia. É uma matriz de caracteres cujo primeiro caractere é nulo (portanto, vazio), que não é o mesmo que C #. Meu ponto aqui é que em diferentes linguagens você representaria uma string vazia de maneiras diferentes (e elas podem ter significados diferentes) - ter um string.Empty impede essa ambiguidade.

Ao contrário do que os outros dizem sobre vários objetos - isso não é um problema, já que qualquer literal de string será internado na compilação. Isso inclui o valor de string.Empty - "" . Sempre que qualquer um desses itens for repetido no código, o objeto será recuperado do conjunto interno. Isso é verdadeiro por domínio do aplicativo .

    
por 17.01.2012 / 19:24
fonte
14

Eu não tenho 100% de certeza sobre as fontes em que aprendi, mas alguns dos pontos para usá-lo incluem:

  • Cada string em um assembly .NET é única, então

    string foo = "";
    string bar = "";
    

    resulta em 2 strings no assembly de saída, pois as strings são imutáveis. Ter as duas referências string.Empty reduz o tamanho da montagem.

  • Explicitação. Quando você se deparar com string.Empty , a intenção é clara de que deveria ser uma string vazia. Mas se você se deparar com foo = "" , o programador removeu o conteúdo da string enquanto testava e esqueceu de adicioná-lo de volta, ou é para ser assim?
por 17.01.2012 / 18:53
fonte
2

Nenhum objeto será criado para string.Empty . Usar "" criará um objeto que provavelmente virá do conjunto interno de strings.

No passado, as pessoas executavam testes e String.Empty é um pouco mais rápido, mas é uma micro-otimização.

String.Empty é isso:

//The Empty constant holds the empty string value.   
//We need to call the String constructor so that the compiler doesn't mark 
//this as a literal.   
//Marking this as a literal would mean that it doesn't show up as a field 
//which we can access from native.  
public static readonly String Empty = ""; 
    
por 17.01.2012 / 21:32
fonte
0

É uma questão de otimização do consumo de memória e otimização da comparação de strings. Toda vez que você está usando uma string vazia em seu aplicativo, você está alocando um objeto de string contendo 0 caracteres. Quanto à comparação de strings, isso pode ser feito comparando referências (ponteiros) em vez de caractere por caractere, o que é mais rápido até mesmo para strings vazias.

Se você estiver usando muitas vezes a mesma string em seu aplicativo, poderá usar o mesmo tipo de mecanismo chamando String.Intern () com sua string. Mas se você estiver usando cada string apenas uma vez, então você só usará mais memória.

So String.Empty é apenas uma otimização de caso especial que vale a pena fazer pela maioria das aplicações .Net, por isso foi integrada na BCL.

Para mais detalhes sobre este assunto, recomendo vivamente a leitura de postagem do blog de Eric Lippert .

Você também deve dar uma olhada em esta documentação referida por seu blog postar.

    
por 24.01.2012 / 04:01
fonte

Tags