2009-04-09 16 views
25

Tengo curiosidad por si algún desarrolladores utilizan String.IsNullOrEmpty() más a menudo con una negativa que positiva con unString.IsNullOrEmpty() vs string.NotNullOrEmpty()

por ejemplo,

if (!string.IsNullOrEmpty()) 

Así es como utilizo el método el 99% del tiempo. ¿Cuál fue la decisión de diseño para esto?

+10

Creo que los métodos con resultado booleano deberían ser "positivos" en el sentido de que deberían usar "Es ..." en lugar de "No ... "... solo una idea de por qué es así. – Joey

+0

@Johannes, sí ... ¡definitivamente positivo! –

+0

¿Por qué MS cree que es necesario agregar un exceso de hinchazón? Ugh ... –

Respuesta

55

Porque "IsNullOrEmpty" es más fácil de entender que "NotNullOrEmpty". Este último podría interpretarse como:

  1. No es nulo y no está vacío
  2. No es nulo o está vacío
1

Ese es el uso más común que he visto.

5

convenciones de nomenclatura C# dictan que sus expresiones deben ser en el sentido positivo como "Is ..." y no "IsNot ..."

EDIT: Por lo general, lo uso cuando se hace la comprobación de errores y validación de entrada al comienzo de un método y genera una excepción si el parámetro es nulo o está vacío.

if (string.IsNullOrEmpty(myParameter))
{
throw new ....
}

34

negativos dobles se desaniman por lo general en el nombramiento de las cosas. !string.NotNullOrEmpty(...) haría uno.

+0

De hecho, teníamos el nombre de un chico como variable "isNotGuam" en nuestra base de códigos. Siempre es muy divertido tratar de descifrar lo que significa (en Delphi) si no isNotGuam continuación –

+1

if (! String.NotNullOrEmpty (..)) {} else { // goooooo! } – meandmycode

+0

No es necesario que el verbo sea negativo, fue un mal ejemplo –

0

Personalmente prefiero atender el escenario no negada por primera vez. Simplemente tiene sentido para mí hacer primero la parte verdadera y luego la falsa. Se reduce al estilo personal.

4

Quizás porque entonces el nombre debería ser el largo IsNotNullAndNotEmpty para ser tan específico.

6

Así como una nota al margen, yo prefiero el método de extensión:

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

encuentro se lee mejor decir:

if(myValue.IsNullOrEmpty()) 

o

if(!myValue.IsNullOrEmpty()) 
+2

Excepto que no debe hacer que los métodos de extensión funcionen con instancias nulas ya que no puede hacer eso con los métodos normales. –

+3

@Dan: en realidad, puedes http://stackoverflow.com/questions/647643/string-isnullorblank-extension-method. +1. – sipwiz

+3

@Dan: Supongo que eso es solo filosofía ... No tengo ningún problema con los métodos de extensión que funcionan en nulo, siempre que quede claro en el nombre del método: value.IsNull(), value.ThrowIfNull() o value.IsNullOrEmpty(). –

0

siempre he pensé que parecía ser el camino equivocado, ya que uso el negativo mucho más a menudo que el positivo.

También me gustaría que hubiera una instancia IsEmpty() o IsNotEmpty() para usar cuando la variable se declara dentro de la función. Esto no podría ser IsNullOrEmpty() o IsNotNullOrEmpty() como si la instancia fuera nula, entonces obtendría una excepción de referencia nula.

11

Para aquellos lógicos que existen,! String.IsNullOrEmpty no es equivalente a string.IsNotNullOrEmpty. @Guffa lo tiene correcto. Usando la ley de DeMorgan, tendría que ser string.IsNotNullAndNotEmpty para ser equivalente.

¬ (nulo ∨ vacío) ⇔ ¬ nula ∧ ¬ vacío

¬ (nulo ∨ vacío) ≠ ¬ nula ∨ vacío

El punto aquí, supongo, es que la forma en que se encuentra actualmente es inequívoco, donde hacer que lo contrario sea inequívoco sería engorroso.

1

"NotNullOrEmpty" es ambiguo, podría significar "(no nulo) o vacío" o podría significar "no (nulo o vacío)". Para que no quede ambiguo, deberías usar "NotNullAndNotEmpty", que es un bocazas.

Además, la denominación "IsNullOrEmpty" fomenta el uso como una cláusula de guardia, que creo que es útil. Por ejemplo:

if (String.IsNullOrEmpty(someString)) 
{ 
    // error handling 
    return; 
} 
// do stuff 

que creo que es por lo general más limpio que:

if (!String.IsNullOrEmpty(someString)) 
{ 
    // do stuff 
} 
else 
{ 
    // error handling 
    return; 
} 
1

De hecho, me inclinaría a ofrecer una respuesta diferente de la explicación "es ambigua" proporcionada por varios otros (aunque estoy de acuerdo con esa respuesta también):

Personalmente, me gusta minimizar la anidación en mi código, ya que (para mí) cuanto más código de llaves tiene, más difícil es seguirlo.

Por lo tanto me gustaría mucho prefieren este (por ejemplo):

public bool DoSomethingWithString(string s) { 
    if (string.IsNullOrEmpty(s)) 
     return false; 

    // here's the important code, not nested 
} 

a esto:

public bool DoSomethingWithString(string s) { 
    if (!string.IsNullOrEmpty(s)) { 
     // here's the important code, nested 
    } else { 
     return false; 
    } 
} 

Este es un escenario bastante específica (donde un/cadena nula vacío solicita una salida inmediata) y claramente no es la forma en que un método que usa IsNullOrEmpty siempre estaría estructurado; pero creo que en realidad es bastante común.

5

siempre se crea un método de extensión para "HasContent()" que generalmente tiene sentido, sigue las especificaciones "positivos", y lo guarda en exceso de código porque yo lo uso mucho más a menudo que su contraparte:

public static bool HasContent(this string s) { 
    return !string.IsNullOrEmpty(s); 
} 
+0

Gracias. Solo estaba pensando en el mejor nombre para esto. Se me ocurrió "HasValue" y "IsPopulated", pero HasContent es probablemente mejor que ambos. –

+0

También agrego un método de extensión IsEmpty() para brevedad y legibilidad. Sé que la gente podría quejarse de que no se use la palabra Null, pero estoy contento con esta excepción para la clase de cadena. – Henry

2

Por supuesto, siempre podría usar string.IsNullOrWhiteSpace(string) ahora en lugar de string .IsNullOrEmpty(string) de .NET 4.0

Cuestiones relacionadas