¿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?
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)
[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
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?IsNullOrWhitespace()
coincidiría con una cadena vacía. En esenciaIsNullOrEmpty()
coincide con un subconjunto deIsNullOrWhitespace()
.Las diferencias en la práctica:
fuente
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 :)fuente
Contains
. Si desea asegurarse de que el nombre de usuario no puede consistir solo en espacios ,IsNullOrWhiteSpace
está bien.IsNullOrEmpty
asegura solo que el nombre de usuario se ingresó de alguna manera.Aquí está la implementación real de ambos métodos (descompilado usando dotPeek)
fuente
IsNullOrWhiteSpace
es ciertostring.Empty
! Eso es una ventaja :)¡Dice que todo
IsNullOrEmpty()
no incluye espacios en blanco mientras queIsNullOrWhiteSpace()
sí!IsNullOrEmpty()
Si la cadena es:-Null
-Empty
IsNullOrWhiteSpace()
Si la cadena es:-Null
-Empty -Contains
White Spaces Only
fuente
Mira esto con IsNullOrEmpty y IsNullOrwhiteSpace
Verás que IsNullOrWhiteSpace es mucho más lento: /
fuente
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.
fuente
¿Qué pasa con esto para atrapar a todos ...
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í.
fuente
En el estándar .Net 2.0:
fuente