2009-04-24 5 views
7

Al tratar de averiguar si una cadena es nula o está vacía, normalmente ya tengo la cadena. Es por eso que yo hubiera esperado una función de utilidad como String.IsNullOrEmpty() para trabajar sin parámetros:¿Por qué no hay un método de sobrecarga IsNullOrEmpty sin parámetros?

String myString; 
bool test=myString.IsNullOrEmpty(); 

Sin embargo, esto no funciona, porque IsNullOrEmpty espera un parámetro de cadena. En su lugar, tengo que escribir:

String myString; 
bool test=String.IsNullOrEmpty(myString); 

¿Por qué es así? Parece innecesariamente torpe. Por supuesto, puedo escribir fácilmente un método de extensión propio para esto, pero parece ser una omisión muy obvia, así que me pregunto si hay alguna buena razón para esto. No puedo creer que la sobrecarga sin parámetros de esta función haya sido olvidada por Microsoft.

Respuesta

27

Este método ha existido mucho antes de que se añadieron los métodos de extensión a C#, y antes de que los métodos de extensión, no había manera de definir un método/propiedad de instancia como xyz.IsNullOrEmpty() que todavía se podría llamar si xyz fue null.

+0

Buen punto, aunque me hace preguntarme por qué no llenan el vacío ahora que sería posible. –

+10

Parece que IsNullOrEmpty se implementaría de manera más grata como propiedad, en realidad, pero desafortunadamente no tenemos propiedades de extensión. – mquander

27

Si la cadena sería null, llamar al IsNullOrEmpty() provocaría un NullReferenceException.

String test = null; 

test.IsNullOrEmpty(); // Instance method causes NullReferenceException 

Ahora tenemos métodos de extensión y podemos implementar esto con un método de extensión y evitar la excepción. Pero siempre tenga en cuenta que esto solo funciona porque los métodos de extensión no son más que azúcar sintáctica para métodos estáticos.

public static class StringExtension 
{ 
    public static Boolean IsNullOrEmpty(this String text) 
    { 
     return String.IsNullOrEmpty(text); 
    } 
} 

Con este método de extensión del follwing nunca se produce una excepción

String test = null; 

test.IsNullOrEmpty(); // Extension method causes no NullReferenceException 

porque es simplemente azúcar sintáctica para esto.

StringExtension.IsNullOrEmpty(test); 
5

Antes de C# 3.0 y los métodos de extensión no había forma de llamar a un método en un objeto nulo.

3

La razón por la que no hay un método de instancia es porque si la cadena es realmente nula, myString.IsNullOrEmpty arrojaría.

+0

No si está implementado como un método de extensión, por lo que estaba preguntando en primer lugar. –

0

Se podría hacer que esto ocurra en C# 3.0:

public static class StringExtensions 
{ 
    public static bool IsNullOrEmpty(this string value) 
    { 
     return string.IsNullOrEmpty(value); 
    } 
} 

Entonces, esto va a funcionar:

test.IsNullOrEmpty(); 

PERO

Es importante saber que muchos consideran que ser una mala práctica. Esto se debe a que infringe las expectativas del usuario. Úselo con esa precaución.

+0

¿Podría explicar un poco más por qué consideraría esto como una mala práctica? Estaba sospechando algo como esto, por eso hice la pregunta en primer lugar, pero todavía no puedo ver por qué el comportamiento intuitivo de una clase sería malo, sin importar cómo se implementa. No veo una forma en que el método de extensión pueda volverse dañino, especialmente porque solo es azúcar sintáctico de todos modos. –

2

He creado un método de extensión - IsNothing - que comprobará no solo si es nulo o está vacío, sino que solo contiene espacios.

public static bool IsNothing(this string source) 
{ 
    if (source == null || source.Length == 0) 
    { 
     return true; 
    } 
    else if (source.Trim().Length == 0) 
    { 
     return true; 
    } 
    return false; 
} 
+0

Gracias por la idea. – tvanfosson

+0

... y todavía pasa mis pruebas unitarias !!! – tvanfosson

0

Si usted está en el proceso de añadir métodos de extensión o métodos de ayuda para probar sus cadenas es posible que desee añadir también uno que recorta la cadena, así como la mayoría de nosotros en muchos casos tampoco quieren una cadena que tiene espacios en blanco como una pestaña o espacios.

Aquí está uno de nuestros métodos de prueba bool IsTrimStringNullOrEmpty (valor de cadena) public static


{
        si (valor == null) return true;
        if (value.Trim() == string.Empty) return true;
        return false;
}

O

Si quieres poner a prueba el valor y lo han recortado al mismo tiempo si NotNullOrEmpty

public static bool IsTrimStringNullOrEmpty (valor de cadena ref)
{
        if (value == null) return true;
        value = value.Trim();
        if (value == string.Empty) return true;
        return false;
}

1

Si bien es perfectamente posible (y válida) para definir un método de extensión para lograr esto, yo estaría preocupado de que tiene un aspecto extraño sintácticamente, en el que aparece ser una llamada a un método en un objeto que podría ser nulo.

YMMV, pero seguiré con String.IsNullOrEmpty.

Cuestiones relacionadas