El nuevo método IsNullOrWhiteSpace de Visual Studio 2010
Nota previa: Aunque la siguiente entrada tiene su foco puesto en VB como lenguaje, es igualmente aplicable a C#.
Dentro de nuestras aplicaciones nos encontramos con situaciones en las que tenemos que evaluar si una cadena de texto tiene información o no.
Podemos preguntar si una cadena es nula o está vacía de la forma siguiente:
If (test Is Nothing Or
test = «») Then
MessageBox.Show(«nulo o vacio»)
End If
La ejecución de estas instrucciones en Visual Basic 2010 nos mostrará un mensaje en pantalla con el mensaje de nulo o vacío.
Si cambiamos las líneas anteriores por estas otras donde el único cambio es la asignación de una cadena vacía en la variable test:
If (test Is Nothing Or
test = «») Then
MessageBox.Show(«nulo o vacio»)
End If
Seguimos obteniendo el mismo resultado.
Ahora bien, Visual Studio nos proporciona un método que simplifica bastante la pregunta acerca de una cadena, si es nula o vacía.
Ese método es el método IsNullOrEmpty.
El código anterior quedaría entonces enormemente simplificado de la siguiente manera:
If (String.IsNullOrEmpty(test)) Then
MessageBox.Show(«nulo o vacio»)
End If
Sin embargo, si modificamos el código por este otro:
If (String.IsNullOrEmpty(test)) Then
MessageBox.Show(«nulo o vacio»)
End If
Observaremos que ahora el método IsNullOrEmpty no detecta que la cadena es una cadena vacía, ya que el espacio en blanco hace que no sea vacía.
Sin embargo, la diferencia entre el espacio en blanco y una cadena vacía es a veces discutible y muy estrecha.
Para algunos, un espacio en blanco representa un caracter (el 32 para más señas), sin embargo, para otros… ese espacio en blanco no contiene información relevante en según que procesos y les gustaría que fuera detectado como cadena vacía. ¿Quién tiene la razón?.
Por esto y para resolver el problema, aparece en escena el método IsNullOrWhiteSpace que ha sido incluido en .NET Framework 4.0 y por ende en Visual Studio 2010, el cual nos indica si una cadena es nula o vacía, entendiendo por vacía el espacio o espacios en blanco.
El ejemplo anterior último para quien quiera tratar el carácter 32 (espacio en blanco) como cadena vacía, quedaría representado de la siguiente manera:
If (String.IsNullOrWhiteSpace(test)) Then
MessageBox.Show(«nulo o vacio»)
End If
En esta oportunidad, nuestra cadena con un espacio en blanco, será interpretada como cadena vacía, o mejor dicho, se entenderá que no hay caracteres representativos entiendo como único caracter no representativo el caracter 32.
En mi caso, antes de este método tenía implementada una función extensible que hacía esta acción. Ahora, esa función extensible pasará a mejor vida gracias a este nuevo método de Visual Studio 2010.
7 Responsesso far
Esteban, tu código (re)implementa String.IsNullOrEmpty( ), no IsNullOrWhiteSpace( ).
Hola @Esteban, gracias por comentar y compartir.
Tal y como dice @Pablo, tu código implementa IsNullOrEmpty, pero no IsNullOrWhiteSpace, o al menos no de la forma correcta. Además, tu código no está escrito correctamente.
Para aclarar esto y para que no lleve a confusión, el código de tu extensor correcto sería:
If (astring Is Nothing Or astring = «») Then
Return True
End If
End Function
Sin embargo, implementa IsNullOrEmpty.
Respecto a IsNullOrWhiteSpace, una extensión válida para .NET Framework 3.5 o versión anterior sería la siguiente:
If (information Is Nothing OrElse information.Trim() = «») Then
Return True
End If
End Function
Un ejemplo de uso de esta función sería:
Dim cadena As String
MessageBox.Show(cadena.IsNullOrHaveSpace() & Environment.NewLine & cadena.IsNullOrWhiteSpace())
cadena = «»
MessageBox.Show(cadena.IsNullOrHaveSpace() & Environment.NewLine & cadena.IsNullOrWhiteSpace())
cadena = » »
MessageBox.Show(cadena.IsNullOrHaveSpace() & Environment.NewLine & cadena.IsNullOrWhiteSpace())
Esto devolvería (con tu función y la adecuada):
True / True
True / True
False / True
Un saludo.
Jorge Serrano, su extensión hace Trim() ??
Salu2grz
Pues vaya… y porque no lo han implementado como un método de extensión de string????
Ya «canta» IsNullOrEmpty pero se admite porque antes no existían los métodos de extensión, pero este otro método estático??
Esos de MS a veces hacen cada cosa…
@preguntoncojonero,
efectivamente, mi metodo usa Trim() y se que no es lo mas efectivo del mundo.
Hice uno con expresiones reguladas, pero las expresiones reguladas son especialmente utiles cuando la cantidad de informacion es grande y ahi se nota y mucho el rendimiento, cosa que no se nota en casos como cadenas de texto pequeñas que era el uso de mi extension.
Ahi Trim() hace su trabajo y apenas deja notar perdida de rendimiento alguna.
Eso si, el codigo de IsNullOrWhiteSpace de .NET Framework 4.0 parece mucho mas optimo:
public static bool IsNullOrWhiteSpace(string value)
{
if (value != null)
{
for (int i = 0; i < value.Length; i++) { if (!char.IsWhiteSpace(value[i])) { return false; } } } return true; } #Eduard, a mi tambien me hubiera gustado ver ese metodo como extension de String. Aun y asi, esta como estatico en String y tampoco molesta mucho, aunque entre poner String.IsNullOrWhiteSpace(test) y test.IsNullOrWhiteSpace() hay un abismo en cuanto a claridad creo yo, y en cuanto a rendimiento no tengo ahora mismo ni idea de cual es mejor o peor o si da igual. Todo esto, me da pie a escribir una entrada sobre algo que me ronda la cabeza en este momento. Mirare a ver... 🙂
A mí me parece que podían haber aprovechado el tiempo el incluir otro tipo de funcionalidades… cosas como esta o el nuevo Enum.HasFlag me parece que sobran… o quizá es que las tendencias cambian y en MS ven que necesitan agregar este tipo de métodos…
@Jorge
Yo personalmente pienso que todos estos métodos helper, que suelen meterse como estáticos en la clase, deberían ser siempre métodos de extensión.
No por tema de claridad de llamada (que también, los métodos estáticos no dejan de ser reminiscencias de diseños procedurales), ni por rendimiento (que debería ser idéntico, no hay razón para que no lo sea, aunque ni idea), sino simplemente por… filosofía.
Que sentido tiene «hinchar» una clase con tropecientos métodos estáticos, que arrastras siempre, en lugar de poner estos métodos estáticos en otro sitio (que es donde deben estar) y gracias al mecanismo de métodos de extensión dejar que el compilador «haga la magia» de que te parezcan de la clase?
Los métodos estáticos deberían usarse SOLO para aquellos que leen/modifican estados compartidos de la clase. En otro claso son métodos helper, y en mi opinión deberían ser la mayoría de las veces métodos de extensión.
En fin, como digo sólo es mi opinión y me gustaría contrastarla con la de otra gente, pero a veces tengo la sensación que MS hace cada chapuza…
Saludos figura!