El nuevo método IsNullOrWhiteSpace de Visual Studio 2010 - Jorge Serrano - MVP Visual Developer - Visual Basic

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:

Dim test As String
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:

Dim test As String = "" 
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:

Dim test As String
If
 (String.IsNullOrEmpty(test)) Then
    MessageBox.Show("nulo o vacio")
End If

Sin embargo, si modificamos el código por este otro:

Dim test As String = " "
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:

Dim test As String = " "
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.

Published 3/11/2009 8:30 por Jorge Serrano
Comparte este post:

Comentarios

Tuesday, November 03, 2009 5:46 PM por Pablo Alarcón García

# re: El nuevo método IsNullOrWhiteSpace de Visual Studio 2010

Esteban, tu código (re)implementa String.IsNullOrEmpty( ), no IsNullOrWhiteSpace( ).

Tuesday, November 03, 2009 6:07 PM por Jorge Serrano

# re: El nuevo método IsNullOrWhiteSpace de Visual Studio 2010

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:

<Extension()> Public Function IsNullOrHaveSpace(ByVal aString As String) As Boolean

   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:

<Extension()> Public Function IsNullOrWhiteSpace(ByVal information As String) As Boolean

   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.

Thursday, November 05, 2009 1:14 PM por preguntoncojonero

# re: El nuevo método IsNullOrWhiteSpace de Visual Studio 2010

Jorge Serrano, su extensión hace Trim() ??

Salu2grz

Thursday, November 05, 2009 2:42 PM por Eduard Tomàs i Avellana

# re: El nuevo método IsNullOrWhiteSpace de Visual Studio 2010

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...

Thursday, November 05, 2009 3:19 PM por Jorge Serrano

# re: El nuevo método IsNullOrWhiteSpace de Visual Studio 2010

@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... :-)

Thursday, November 05, 2009 4:59 PM por Héctor

# re: El nuevo método IsNullOrWhiteSpace de Visual Studio 2010

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...

Friday, November 06, 2009 9:17 AM por Eduard Tomàs i Avellana

# re: El nuevo método IsNullOrWhiteSpace de Visual Studio 2010

@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!