2011-08-07 16 views

Respuesta

272

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 otra espacio en blanco, además de cadena vacía.

El término "espacio en blanco" incluye todos los caracteres que no están visibles en la pantalla . Por ejemplo, el espacio, el salto de línea, la pestaña y la cadena vacía son blancos caracteres de espacio *.

Referencia: Here

Para obtener un rendimiento, IsNullOrWhiteSpace no es lo ideal, pero es buena. Las llamadas al método darán lugar a 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 de puede ser mala, pero también es divertida.

Referencia: Here

Comprobar el código fuente (Fuente de referencia de .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 
+0

Ahora estoy confundido: "IsNullOrWhiteSpace es un método de conveniencia que es similar al siguiente código, excepto que ofrece un rendimiento superior" desde aquí: http://msdn.microsoft.com/en-us/library/system.string .isnullorwhitespace (v = vs.110) .aspx – robasta

+0

@rob El código en cuestión es 'return String.IsNullOrEmpty (value) || value.Trim(). Length == 0; ', que implica una nueva asignación de cadena y dos comprobaciones por separado. Lo más probable es que dentro de IsNullOrWhitespace se realice a través de un solo pase sin asignaciones, verificando que cada char en la cadena sea el espacio en blanco, por lo tanto, un rendimiento superior. ¿Qué te confunde en realidad? –

+4

Gracias! Nunca supe si '' 'IsNullOrWhitespace()' '' coincidiría con una cadena vacía. En esencia, '' 'IsNullOrEmpty()' '' coincide con un subconjunto de '' 'IsNullOrWhitespace()' ''. – gligoran

34

Son funciones diferentes. Debes decidir para tu situación qué necesitas.

No considero que utilizar ninguna de ellas sea una mala práctica. La mayoría de las veces IsNullOrEmpty() es suficiente. Pero tiene la opción :)

+2

Por ejemplo, un campo de nombre de usuario en una página de registro usaría IsNullOrEmtpy para validar lo que un usuario no podría tener un espacio como su nombre. – Chris

+12

@Rfvgyhn: si desea verificar que el nombre de usuario no tenga espacios _en cualquier lugar_ - debe usar 'Contiene'. Si desea asegurarse de que el nombre de usuario no puede contener espacios _only_ - 'IsNullOrWhiteSpace' está bien. 'IsNullOrEmpty' asegura que solo se ingresó el nombre de usuario de alguna manera. –

+1

De hecho. 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 normalmente contaría con un poco más de lógica que solo verificar si está vacía o en blanco. – Chris

3

¿Y esto para toda una captura ...

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

Esto recortar todos los espacios si están allí para evitar la pérdida de rendimiento de IsWhiteSpace, lo que permitirá la cadena para cumplir la condición "vacía" si no es nula.

También creo que esto es más claro y, en general, es una buena práctica para ajustar cadenas de todos modos, especialmente si los está poniendo en una base de datos o algo así.

+27

Esta comprobación tiene un grave inconveniente. Llamar a Trim() en x dará como resultado una excepción de referencia nula cuando se pase como nulo. –

+9

Buen punto. Dejaré la respuesta incorrecta para mostrar el inconveniente. – Remotec

+1

IsNullOrWhitespace PUEDE optimizarse para comprobar si está vacío o nulo, evitando comprobar si la cadena contiene espacios en blanco. Este método siempre realizará la operación de recorte. Además, aunque podría optimizarse, probablemente creará otra cadena en la memoria. – Sprague

26

Aquí es la aplicación real de ambos 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; 
    } 
+4

Así que esto significa 'IsNullOrWhiteSpace' es cierto para' string.Empty' también! Eso es un bonus :) –

+4

sí, más seguro será para use IsNullOrWhiteSpace (True for String.empty, null y whitespace) – dekdev

139

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 
+2

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

6

lo dice todo IsNullOrEmpty() no incluye el espaciamiento blanco, mientras que IsNullOrWhiteSpace() hace!

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

IsNullOrWhiteSpace() Si la cadena es:
-null
-Empty
Espacios -Contiene blanco solamente

+2

Bajé la votación porque mientras explicas lo que hace cada función, no respondes la pregunta real. – tuespetre

+0

Debe editar su respuesta para incluir toda la lista de "espacio en blanco", como se define en el marco: El término "espacio en blanco" incluye todos los caracteres que no están visibles en la pantalla. Por ejemplo, espacio, salto de línea, pestaña y cadena vacía son caracteres de espacio en blanco. – georger

2

mira esto con 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(); 

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

+1

Esto es obvio porque IsNullOrEmpty ocurre en tiempo constante O (1) mientras que IsNullOrwhiteSpace posiblemente requiera una iteración completa de la cadena u O (n) tiempo. Entonces su ejemplo cronometrado realmente usa casi O (n^2) tiempo. 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. –

Cuestiones relacionadas