Saber si una cadena está vacía usando métodos de extensión (C#/VB.Net)
Hace unos meses comentaba las distintas opciones para saber si una cadena está vacía en C#, y la conclusión era la
recomendación del uso del método estático string.IsNullOrEmpty
,
sobre todo si podemos asegurar que no aparecerá el famoso bug del mismo (que al final no es para
tanto, todo sea dicho).
Los métodos de extensión nos brindan la posibilidad de
hacer lo mismo pero de una forma más elegante e intuitiva, impensable hasta la
llegada de C# 3.0: extendiendo la clase string
con un método que
compruebe su contenido.
La forma de conseguirlo es bien sencilla.
Declaramos en una clase estática el método de extensión sobre el tipo
string
:
public static class MyExtensions
{
public static bool IsNullOrEmpty(this string s)
{
return s == null || s.Length == 0;
}
}
Y listo, ya tenemos el nuevo método listo para ser utilizado:
string name = getCurrentUserName();
if (!name.IsNullOrEmpty())
...
De todas formas, hay un par de reflexiones que considero interesante
comentar.
En primer lugar, fijaos en el ejemplo anterior que aunque la
variable name
contenga un nulo, se ejecutará la llamada a
IsNullOrEmpty()
sin provocar error, algo imposible si se tratara de
un método de instancia. Obviamente, se debe a que en realidad se está
enmascarando una llamada a un método estático al que le llegará como parámetro
un null
.
Como consecuencia de lo anterior, y dado que no se
puede distinguir a simple vista en una llamada a un método si éste es de
instancia o de extensión, es posible que un desarrollador considerara esta
invocación incorrecta. Esto forma parte de los inconvenientes de los métodos de extensión que ya cité
en un post anterior.
En segundo lugar, visto lo visto cabría preguntarse,
¿por qué podemos extender una clase añadiéndole nuevos métodos pero no es
posible incluir otro tipo de elementos, como eventos o propiedades? En el caso
anterior podría quedar más fino que IsNullOrEmpty
fuera una
propiedad de string
, ¿no?
Sin embargo, esto no es posible
de momento. Según comentó ScottGu hace tiempo, se estaba considerando añadir la
posibilidad de extender las clases también con nuevas propiedades. Supongo que
el hecho de no haberla incluido en esta versión se deberá a que no era necesario
para LINQ, la estrella de esta entrega... ¡y para dejar algo por hacer para C#
4.0, claro! ;-)
En cualquier caso, se trata principalmente de una
cuestión de estética del código. Todo lo que conseguimos con las propiedades se
puede realizar a base de métodos; de hecho, las propiedades no son sino
interfaces más agradables a métodos getters y setters, al más
puro estilo Java, subyacentes.
Por último, todo lo dicho es válido para
VB.NET 9, salvo las obvias diferencias. El código equivalente al anterior
sería:
Imports System.Runtime.CompilerServices
Module MyExtensions
<Extension()> _
Public Function IsNullOrEmtpy(ByVal s As String) As String
Return (s = Nothing) OrElse (s.Length = 0)
End Function
End Module
[...]
' Forma de invocar el método:
If s.IsNullOrEmtpy() Then
[...]
Publicado en: http://www.variablenotfound.com/.