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

207

¿El uso de string.IsNullOrEmpty(string)cuando se verifica una cadena se considera una mala práctica cuando existe string.IsNullOrWhiteSpace(string)en .NET 4.0 y superior?

eomeroff
fuente

Respuestas:

328

La mejor práctica es seleccionar la más adecuada.

.Net Framework 4.0 Beta 2 tiene un nuevo método IsNullOrWhiteSpace () para cadenas que generaliza el método IsNullOrEmpty () para incluir también otros espacios en blanco además de la cadena vacía.

El término "espacio en blanco" incluye todos los caracteres que no son visibles en la pantalla. Por ejemplo, espacio, salto de línea, tabulación y cadena vacía son espacios en blanco * .

Referencia: aquí

Para el rendimiento, IsNullOrWhiteSpace no es ideal pero es bueno. Las llamadas al método generarán una pequeña penalización de rendimiento. Además, el método IsWhiteSpace en sí tiene algunas indirecciones que pueden eliminarse si no está utilizando datos Unicode. Como siempre, la optimización prematura puede ser mala, pero también es divertida.

Referencia: aquí

Verifique el código fuente (Reference Source .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;
}

Ejemplos

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
fuente
Ahora estoy confundido: "IsNullOrWhiteSpace es un método conveniente que es similar al siguiente código, excepto que ofrece un rendimiento superior" desde aquí: msdn.microsoft.com/en-us/library/…
robasta
@rob El código en cuestión es return String.IsNullOrEmpty(value) || value.Trim().Length == 0;, que implica una nueva asignación de cadenas y dos verificaciones separadas. Lo más probable es que dentro de IsNullOrWhitespace se realice a través de una sola pasada sin ninguna asignación comprobando que cada carácter en la cadena es el espacio en blanco, por lo tanto, un rendimiento superior. ¿Qué te confunde en realidad?
Ivan Danilov
10
¡Gracias! Nunca supe si IsNullOrWhitespace()coincidiría con una cadena vacía. En esencia IsNullOrEmpty()coincide con un subconjunto de IsNullOrWhitespace().
gligoran
156

Las diferencias en la práctica:

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
fuente
44
Esta debería ser la respuesta aceptada en mi opinión. Tiene más sentido que la respuesta aceptada al mostrar ejemplos reales en lugar de una redirección.
eaglei22
37

Son diferentes funciones. Debe decidir para su situación qué necesita.

No considero usar ninguno de ellos como una mala práctica. La mayor parte del tiempo IsNullOrEmpty()es suficiente. Pero tienes la opción :)

Ivan Danilov
fuente
2
Por ejemplo, un campo de nombre de usuario en una página de registro usaría IsNullOrEmtpy para validar para que un usuario no pueda tener un espacio como su nombre.
Chris
14
@Rfvgyhn: si desea comprobar que el nombre de usuario no tiene espacios en ningún lado , debe usarlo Contains. Si desea asegurarse de que el nombre de usuario no puede consistir solo en espacios , IsNullOrWhiteSpaceestá bien. IsNullOrEmptyasegura solo que el nombre de usuario se ingresó de alguna manera.
Ivan Danilov
1
En efecto. Solo estaba tratando de dar un ejemplo concreto para agregar a su respuesta. En el mundo real, una regla de validación de nombre de usuario generalmente contendría un poco más de lógica que simplemente verificar si está vacía o en blanco.
Chris
28

Aquí está la implementación real de ambos métodos (descompilado 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
fuente
44
¡Entonces esto significa que también IsNullOrWhiteSpacees cierto string.Empty! Eso es una ventaja :)
Ε Г И І И О
44
sí, lo más seguro será usar IsNullOrWhiteSpace (True para String.empty, null y whitespace)
dekdev
7

¡Dice que todo IsNullOrEmpty()no incluye espacios en blanco mientras que IsNullOrWhiteSpace()sí!

IsNullOrEmpty()Si la cadena es:
-Null
-Empty

IsNullOrWhiteSpace()Si la cadena es:
-Null
-Empty -Contains
White Spaces Only

HK Shambesh
fuente
2
Voté en contra porque mientras explicas qué hace cada función, no respondes la pregunta real.
martes
2
Debe editar su respuesta para incluir la lista completa de "espacio en blanco", según lo define el marco: El término "espacio en blanco" incluye todos los caracteres que no son visibles en la pantalla. Por ejemplo, espacio, salto de línea, tabulación y cadena vacía son caracteres de espacio en blanco.
georger
2

Mira esto con IsNullOrEmpty y 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();

Verás que IsNullOrWhiteSpace es mucho más lento: /

Kabindas
fuente
1
Esto es obvio porque IsNullOrEmpty ocurre en tiempo constante O (1) mientras que IsNullOrwhiteSpace posiblemente requiera una iteración completa de la cadena o el tiempo O (n). Entonces su ejemplo cronometrado en realidad está usando casi el tiempo O (n ^ 2). Para un temporizador con una cadena de tamaño normal, la diferencia de rendimiento será insignificante. Si estaba procesando grandes cantidades de texto o llamándolo en un bucle grande, entonces probablemente no quiera usarlo.
Charles Owen el
1

string.IsNullOrEmpty (str): si desea comprobar si se ha proporcionado el valor de la cadena

string.IsNullOrWhiteSpace (str): básicamente, esto ya es una especie de implementación de lógica de negocios (es decir, por qué "" es malo, pero algo como "~~" es bueno).

Mi consejo: no mezcle la lógica empresarial con las verificaciones técnicas. Entonces, por ejemplo, string.IsNullOrEmpty es el mejor para usar al comienzo de los métodos para verificar sus parámetros de entrada.

beloblotskiy
fuente
0

¿Qué pasa con esto para atrapar a todos ...

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

Esto recortará todos los espacios si están allí, evitando la penalización de rendimiento de IsWhiteSpace, lo que permitirá que la cadena cumpla con la condición "vacía" si no es nula.

También creo que esto es más claro y generalmente es una buena práctica recortar cadenas de todos modos, especialmente si las está colocando en una base de datos o algo así.

Remotec
fuente
34
Esta comprobación tiene un grave inconveniente. Llamar a Trim () en x dará como resultado una excepción de referencia nula cuando se pasa como nulo.
Ε Г И І И О
9
Buen punto. Dejaré la respuesta incorrecta para mostrar el inconveniente.
Remotec
1
IsNullOrWhitespace PUEDE optimizar para verificar si es nulo o vacío, evitando verificar el espacio en blanco de la cadena. Este método siempre realizará la operación de recorte. Además, aunque podría optimizarse, probablemente creará otra cadena en la memoria.
Sprague
if (string.IsNullOrEmpty (x? .Trim ()) debería solucionar el problema nulo
Cameron Forward
0

En el estándar .Net 2.0:

string.IsNullOrEmpty(): Indica si la cadena especificada es nula o una cadena vacía.

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

string.IsNullOrWhiteSpace(): Indica si una cadena especificada es nula, está vacía o si solo consta de caracteres de espacio en blanco.

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