string.IsNullOrEmpty (string) vs. string.IsNullOrWhiteSpace (string)

207

O uso de string.IsNullOrEmpty(string)ao verificar uma string é considerado uma má prática quando existe string.IsNullOrWhiteSpace(string)no .NET 4.0 e superior?

eomeroff
fonte

Respostas:

328

A melhor prática é selecionar a mais apropriada.

O .NET Framework 4.0 Beta 2 possui um novo método IsNullOrWhiteSpace () para seqüências de caracteres que generaliza o método IsNullOrEmpty () para incluir também outro espaço em branco, além da seqüência vazia.

O termo "espaço em branco" inclui todos os caracteres que não são visíveis na tela. Por exemplo, espaço, quebra de linha, tabulação e sequência vazia são caracteres de espaço em branco * .

Referência: Aqui

Para desempenho, IsNullOrWhiteSpace não é ideal, mas é bom. As chamadas de método resultarão em uma pequena penalidade de desempenho. Além disso, o próprio método IsWhiteSpace possui alguns indiretos que podem ser removidos se você não estiver usando dados Unicode. Como sempre, a otimização prematura pode ser ruim, mas também é divertida.

Referência: Aqui

Verifique o código-fonte (Fonte de Referência .NET Framework 4.6.2)

IsNullorEmpty

[Pure]
public static bool IsNullOrEmpty(String value) {
    return (value == null || value.Length == 0);
}

IsNullOrWhiteSpace

[Pure]
public static bool IsNullOrWhiteSpace(String value) {
    if (value == null) return true;

    for(int i = 0; i < value.Length; i++) {
        if(!Char.IsWhiteSpace(value[i])) return false;
    }

    return true;
}

Exemplos

string nullString = null;
string emptyString = "";
string whitespaceString = "    ";
string nonEmptyString = "abc123";

bool result;

result = String.IsNullOrEmpty(nullString);            // true
result = String.IsNullOrEmpty(emptyString);           // true
result = String.IsNullOrEmpty(whitespaceString);      // false
result = String.IsNullOrEmpty(nonEmptyString);        // false

result = String.IsNullOrWhiteSpace(nullString);       // true
result = String.IsNullOrWhiteSpace(emptyString);      // true
result = String.IsNullOrWhiteSpace(whitespaceString); // true
result = String.IsNullOrWhiteSpace(nonEmptyString);   // false
CharithJ
fonte
Agora estou confuso: "IsNullOrWhiteSpace é um método de conveniência semelhante ao código a seguir, exceto que oferece desempenho superior" daqui: msdn.microsoft.com/en-us/library/…
robasta
@rob O código em questão é o return String.IsNullOrEmpty(value) || value.Trim().Length == 0;que envolve uma nova alocação de string e duas verificações separadas. Provavelmente dentro de IsNullOrWhitespace, isso é feito através de uma única passagem, sem alocações, verificando se cada caractere na cadeia de caracteres é o espaço em branco, portanto, um desempenho superior. O que confunde você realmente?
11114 Ivan Danilov
10
Obrigado! Eu nunca soube se IsNullOrWhitespace()corresponderia a uma string vazia. Essencialmente IsNullOrEmpty()corresponde a um subconjunto de IsNullOrWhitespace().
gligoran
156

As diferenças na prática:

string testString = "";
Console.WriteLine(string.Format("IsNullOrEmpty : {0}", string.IsNullOrEmpty(testString)));
Console.WriteLine(string.Format("IsNullOrWhiteSpace : {0}", string.IsNullOrWhiteSpace(testString)));
Console.ReadKey();

Result :
IsNullOrEmpty : True
IsNullOrWhiteSpace : True

**************************************************************
string testString = " MDS   ";

IsNullOrEmpty : False
IsNullOrWhiteSpace : False

**************************************************************
string testString = "   ";

IsNullOrEmpty : False
IsNullOrWhiteSpace : True

**************************************************************
string testString = string.Empty;

IsNullOrEmpty : True
IsNullOrWhiteSpace : True

**************************************************************
string testString = null;

IsNullOrEmpty : True
IsNullOrWhiteSpace : True
Mohammad Dayyan
fonte
4
Esta deve ser a resposta aceita na minha opinião. Faz mais sentido do que a resposta aceita ao mostrar exemplos reais em vez de um redirecionamento.
precisa saber é o seguinte
37

São funções diferentes. Você deve decidir para sua situação o que precisa.

Não considero usar nenhum deles como uma má prática. Na maioria das vezes IsNullOrEmpty()é suficiente. Mas você tem a escolha :)

Ivan Danilov
fonte
2
Por exemplo, um campo de nome de usuário em uma página de registro usaria IsNullOrEmtpy para validar, para que um usuário não pudesse ter um espaço como nome.
Chris
14
@Rfvgyhn: se você quiser verificar se o nome de usuário não possui espaços em nenhum lugar - você deve usá-lo Contains. Se você deseja garantir que o nome de usuário não possa consistir apenas em espaços - IsNullOrWhiteSpaceestá ok. IsNullOrEmptygarante apenas que o nome de usuário tenha sido inserido de alguma forma.
Ivan Danilov
1
De fato. Eu estava apenas tentando dar um exemplo concreto para adicionar à sua resposta. No mundo real, uma regra de validação de nome de usuário normalmente contém um pouco mais de lógica do que apenas verificar se está em branco ou em branco.
Chris
28

Aqui está a implementação real dos dois métodos (descompilada usando dotPeek)

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
    public static bool IsNullOrEmpty(string value)
    {
      if (value != null)
        return value.Length == 0;
      else
        return true;
    }

    /// <summary>
    /// Indicates whether a specified string is null, empty, or consists only of white-space characters.
    /// </summary>
    /// 
    /// <returns>
    /// true if the <paramref name="value"/> parameter is null or <see cref="F:System.String.Empty"/>, or if <paramref name="value"/> consists exclusively of white-space characters.
    /// </returns>
    /// <param name="value">The string to test.</param>
    public static bool IsNullOrWhiteSpace(string value)
    {
      if (value == null)
        return true;
      for (int index = 0; index < value.Length; ++index)
      {
        if (!char.IsWhiteSpace(value[index]))
          return false;
      }
      return true;
    }
dekdev
fonte
4
Portanto, isso também IsNullOrWhiteSpaceé verdade string.Empty! Isso é um bônus :)
8812
4
sim, mais segura será usar IsNullOrWhiteSpace (True para string.Empty, nulos e espaços em branco)
dekdev
7

Diz que tudo IsNullOrEmpty()não inclui espaçamento em branco, enquanto IsNullOrWhiteSpace()inclui!

IsNullOrEmpty()Se a string é:
-Null
-Empty

IsNullOrWhiteSpace()Se a string é:
-Null
-Empty
espaços -Contém Branca Somente

Hk Shambesh
fonte
2
Eu diminuí a votação porque, enquanto você explica o que cada função faz, você não responde à pergunta real.
tuespetre
2
Você deve editar sua resposta para incluir a lista inteira de "espaço em branco", conforme definido pela estrutura: O termo "espaço em branco" inclui todos os caracteres que não são visíveis na tela. Por exemplo, espaço, quebra de linha, tabulação e sequência vazia são caracteres de espaço em branco.
Georger
2

Verifique isso com IsNullOrEmpty e IsNullOrwhiteSpace

string sTestes = "I like sweat peaches";
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();
    for (int i = 0; i < 5000000; i++)
    {
        for (int z = 0; z < 500; z++)
        {
            var x = string.IsNullOrEmpty(sTestes);// OR string.IsNullOrWhiteSpace
        }
    }

    stopWatch.Stop();
    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopWatch.Elapsed;
    // Format and display the TimeSpan value. 
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
    Console.WriteLine("RunTime " + elapsedTime);
    Console.ReadLine();

Você verá que IsNullOrWhiteSpace é muito mais lento: /

Kabindas
fonte
1
Isso é óbvio porque IsNullOrEmpty acontece em tempo constante O (1), enquanto IsNullOrwhiteSpace possivelmente requer uma iteração completa da string ou do tempo O (n). Então, seu exemplo cronometrado está realmente usando quase O (n ^ 2). Para um cronômetro com uma corda de tamanho normal, a diferença de desempenho será insignificante. Se você estava processando grandes quantidades de texto ou chamando-o em um loop grande, provavelmente não desejaria usá-lo.
Charles Owen
1

string.IsNullOrEmpty (str) - se você deseja verificar se o valor da string foi fornecido

string.IsNullOrWhiteSpace (str) - basicamente, esse já é um tipo de implementação de lógica de negócios (ou seja, por que "" é ruim, mas algo como "~~" é bom).

Meu conselho - não misture lógica de negócios com verificações técnicas. Portanto, por exemplo, string.IsNullOrEmpty é o melhor a ser usado no início dos métodos para verificar seus parâmetros de entrada.

beloblotskiy
fonte
0

Que tal isso para pegar tudo ...

if (string.IsNullOrEmpty(x.Trim())
{
}

Isso cortará todos os espaços, se houver, evitando a penalidade de desempenho de IsWhiteSpace, que permitirá que a sequência atenda à condição "vazia" se não for nula.

Eu também acho que isso é mais claro e geralmente é uma boa prática cortar seqüências de qualquer maneira, especialmente se você as estiver colocando em um banco de dados ou algo assim.

Remotec
fonte
34
Esta verificação tem uma desvantagem grave. Chamar Trim () em x resultará em uma exceção de referência nula quando for passada como nula.
Ε Г И І И О
9
Bom ponto. Vou deixar a resposta incorreta para mostrar a desvantagem.
Remotec
1
IsNullOrWhitespace PODE otimizar para verificar se há nulo ou vazio, evitando verificar a seqüência de caracteres para o espaço em branco. Este método sempre executará a operação de corte. Além disso, embora possa ser otimizado, provavelmente criará outra string na memória.
Sprague
if (string.IsNullOrEmpty (x? .Trim ()) deve contornar o problema nulo #
Cameron Forward
0

No padrão .Net 2.0:

string.IsNullOrEmpty(): Indica se a sequência especificada é nula ou vazia.

Console.WriteLine(string.IsNullOrEmpty(null));           // True
Console.WriteLine(string.IsNullOrEmpty(""));             // True
Console.WriteLine(string.IsNullOrEmpty(" "));            // False
Console.WriteLine(string.IsNullOrEmpty("  "));           // False

string.IsNullOrWhiteSpace(): Indica se uma sequência especificada é nula, vazia ou consiste apenas em caracteres de espaço em branco.

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
Sina Lotfi
fonte