Eles são diferentes como outros já responderam.
static void Main(string[] args)
{
string s1 = null;
string s2 = string.Empty;
string s3 = "";
Console.WriteLine(s1 == s2);
Console.WriteLine(s1 == s3);
Console.WriteLine(s2 == s3);
}
results:
false - since null is different from string.empty
false - since null is different from ""
true - since "" is same as string.empty
O problema com o gerenciamento de strings vazias vs. strings nulas está se tornando um problema quando você precisa persistir em um arquivo simples ou transferi-lo por meio de comunicações, então acho que pode ser útil para quem visita esta página dar uma boa solução para esse problema particular.
Com o propósito de salvar strings em um arquivo ou comunicações:
você provavelmente desejará converter a string em bytes.
uma boa prática que recomendo é adicionar 2 segmentos de bytes de cabeçalho à string convertida.
segmento 1 - meta informação que é armazenada em 1 byte e descreve o comprimento do próximo segmento.
segmento 2 - contém o comprimento da string a ser salva.
exemplo:
string "abcd" - para simplificar, vou convertê-la usando o codificador ASCII e obter {65,66,67,68}.
calcular o segmento 2 produzirá 4 - portanto, 4 bytes são o comprimento da string convertida.
calcular o segmento 1 resultará em 1 - já que apenas 1 byte foi usado para armazenar as informações de comprimento da string convertida (que era 4, ou seja, se fosse 260 eu obteria 2)
A nova faixa de bytes agora será {1,4,65,66,67,68}, que pode ser salva em um arquivo.
O benefício em relação ao assunto é que se eu tivesse uma string vazia para salvar eu obteria da conversão um array vazio de bytes no comprimento de 0 e depois de calcular os segmentos eu acabaria tendo {1,0} que pode ser salvo e posteriormente carregado e interpretado de volta em uma string vazia. Por outro lado, se eu tivesse um valor nulo em minha string, acabaria tendo apenas {0} como minha matriz de bytes para salvar e, novamente, quando carregado, poderia ser interpretado de volta como nulo.
Existem mais benefícios, como saber qual o tamanho a ser carregado ou acumulado se você jag várias strings.
Voltando ao assunto - isso irá .. bem, meio que poluirá a pilha, já que os mesmos princípios descritos estão sendo usados por qualquer sistema para diferenciar nulos de vazios .. então sim string.Empty leva mais memória do que nulo, embora eu não chame de poluição .. é apenas mais 1 byte.