2010-01-23 12 views
5

¿Cuál es mejor entre estos tres?String.IsNullOrEmpty (myString) Vs myString! = Null

string myString = ""; 
String.IsNullOrEmpty(myString); 

vs 

string myString = ""; 
if(myString.Length > 0 || myString != null) 

vs 

string myString = ""; 
if (m.Length > 0 | m != null) 

El anterior es más claro, pero ¿hay alguna diferencia de rendimiento entre estos? ¿Qué sucede si, en caso de que una cadena nunca esté vacía, como si se tomara de un cuadro de texto, que podría estar vacío pero no nulo?

Respuesta

15

Bueno, la versión en la pregunta:

if(myString.Length > 0 || myString != null) 

habría definitivamente ser peor, ya que debe hacer la prueba para nullprimera (no segundos) - idealmente un cortocircuito en null por lo que no intente llamar al .Length. Pero en general solo usaría string.IsNullOrEmpty. Siempre puede escribir un método de extensión para hacerlo menos detallado si lo desea (puede llamar a los métodos de extensión en los valores null).

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

Sí, buen consejo que el último. Soy un poco fanático de la cadena. Métodos de extensión de formato :) – Skurmedel

+0

Excelente siempre, nunca pensé en ello. –

+4

@Marc Gravell: me doy cuenta de que el método es estático, pero al llamarlo a una variable de instancia, no todos pueden saber si dicha llamada emitirá una excepción de referencia nula o no. –

4

Vaya con string.IsNullOrEmpty(str). Es más claro y más sucinto. No será un cuello de botella en su aplicación.

Si solo necesita comprobar el "vacío" de la cadena, entonces iría con un cheque en contra de string.Empty ya que expresa su intención mejor.

+2

También es ++ para la reutilización de código – abatishchev

2

Utilizaría el IsNullOrEmpty.

Será más fácil de analizar cuando esté mirando el código más adelante.

Aquí hay otra razón, un poco extraña. Algún programador posterior vendrá más tarde, se rascará la barba y dirá "Creo que myString.trim(). Length! = 0 es mejor" y lo cambiará.

Como han señalado otros: la comprobación del segundo nulo es un posible error de acceso nulo que está por ocurrir: se garantiza que la rutina de la biblioteca está bien.

+4

De ahí la creación de 'IsNullOrWhitespace': http://msdn.microsoft.com /en-us/library/system.string.isnullorwhitespace(VS.100).aspx –

1

El String.IsNullOrEmpty es la mejor elección si no está seguro acerca de cómo probar los diferentes estados de la referencia de cadena (que obviamente es, ya que lo hizo mal ...;).

Utilizando el método de IsNullOrEmpty:

if (String.IsNullOrEmpty(s)) ... 

es equivalente a usar una prueba de cortocircuito para nulo y de longitud cero:

if (s == null || s.Length == 0) ... 

Si sabe que el referene no puede ser nulo, se puede omitir ese control y simplemente verificar la longitud:

if (s.Length == 0) ... 

El métodotambién funcionaría para situaciones normales, pero en el caso de que algo saliera mal y la referencia sea realmente nula, el método IsNullOrEmpty la aceptará silenciosamente, mientras que normalmente debería conocer el error.

0

creo que el String.IsNullOrEmpty (String s) se implementa como:

si (s nula == || s.length == 0) ...

en la API.

+0

... lo que significa que, en lo que respecta al código IL, se genera el mismo IL. Ninguno es más rápido que el otro. – Blade3

+3

No estoy seguro si esto está bien para ponerlo aquí, pero usando Desensamblador, esto es lo que está en la API para String.IsNullOrEmptr (value) { if (value! = Null) { return (value.Longitud == 0); } return true;} –

+0

Eso es probablemente un artefacto de desmontaje en lugar de cómo se ve realmente el código. – ICR

2

Como han dicho otros, IsNullOrEmpty() es superior a las comprobaciones manuales con fines de mantenimiento y no es probable que sufra en rendimiento gracias a las decisiones de tiempo de ejecución del compilador JIT sobre alineación (consulte Eric Gunnerson's comments).

En caso de que alguien más se preguntan cuál es la implementación real .NET parece, aquí está el código .NET 4:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
public static bool IsNullOrEmpty(string value) 
{ 
    if (value != null) 
    { 
     return (value.Length == 0); 
    } 
    return true; 
} 

Ese atributo indica el método también se inlined en NGen (es decir, nativa) imágenes.

+0

Interesante, ** ILSpy.exe ** muestra que ** mscorlib ** -> ** Sistema ** -> ** Cadena ** -> ** IsNullOrEmpty (cadena): bool ** se ve así: ** ' valor de retorno == nulo || value.Length == 0; '**. –

-2

I believe the String.IsNullOrEmpty(String s) is implemented as: if (s == null || s.Length == 0) ... in the API.

eso está mal. Pruébalo y obtendrás una excepción ya que se intentarán las dos afirmaciones. Si s es nulo, entonces s.Length lanzará una execption.

+1

'||' cortocircuitos, entonces no, la segunda expresión no se evaluará si 's' es' nulo'. Además, no es una respuesta. – Ryan

Cuestiones relacionadas