¿Se usa string.IsNullOrEmpty(string)
al verificar una cadena considerada como una mala práctica cuando hay string.IsNullOrWhiteSpace(string)
en .NET 4.0 y superior?string.IsNullOrEmpty (string) vs. string.IsNullOrWhiteSpace (string)
Respuesta
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)
[Pure]
public static bool IsNullOrEmpty(String value) {
return (value == null || value.Length == 0);
}
[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
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 :)
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
@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. –
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
¿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í.
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. –
Buen punto. Dejaré la respuesta incorrecta para mostrar el inconveniente. – Remotec
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
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;
}
Así que esto significa 'IsNullOrWhiteSpace' es cierto para' string.Empty' también! Eso es un bonus :) –
sí, más seguro será para use IsNullOrWhiteSpace (True for String.empty, null y whitespace) – dekdev
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
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
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
Bajé la votación porque mientras explicas lo que hace cada función, no respondes la pregunta real. – tuespetre
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
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:/
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. –
- 1. diferencia (String args ...) vs fn (String [] args)
- 2. StringDictionary vs Dictionary <string, string>
- 3. std :: string :: longitud() vs. std :: string :: size()
- 4. const string vs. #define
- 5. Marshal.PtrToStringUni() vs new String()?
- 6. std :: string vs. char *
- 7. String.IsNullOrEmpty (myString) Vs myString! = Null
- 8. Buffer vs String speed: ¿Por qué String es más rápido?
- 9. joda-time: new DateTime (String) vs DateTime.parse (String)
- 10. String.IsNullOrEmpty() vs string.NotNullOrEmpty()
- 11. Diferencia entre @string y @ + string?
- 12. Split String en String array
- 13. Cómo convertir System :: String^en std :: string?
- 14. return String vs Integer vs undefined vs null
- 15. Haga nuestra propia lista <string, string, string>
- 16. Uso FlurryAgent.onEvent (String EVENTID, mapa <String, String> Parámetros)
- 17. Intent.putExtra (String, Bundle) vs Intent.putExtra (paquete)
- 18. Java Optimization String vs Char Arrays
- 19. collection/string .Contains vs collection/string.IndexOf
- 20. Rendimiento std :: strstr vs std :: string :: encontrar
- 21. Cadena de concatenación vs String Builder. Rendimiento
- 22. Solr Filter Query - String vs. Int
- 23. SQL Server 2008 Empty String vs. Space
- 24. IDictionary <string, string> versus Dictionary <string, string>
- 25. std :: size_t vs size_t vs std :: string :: size_type
- 26. Diferencia entre String [] a y String ... a
- 27. String.Replace (char, char) o Replace (string, string)?
- 28. Cuándo utilizar CultureInfo.GetCultureInfo (String) o CultureInfo.CreateSpecificCulture (String)
- 29. Java: ¿Es confiable assertEquals (String, String)?
- 30. Map <String, String> JSON en
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
@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? –
Gracias! Nunca supe si '' 'IsNullOrWhitespace()' '' coincidiría con una cadena vacía. En esencia, '' 'IsNullOrEmpty()' '' coincide con un subconjunto de '' 'IsNullOrWhitespace()' ''. – gligoran