2012-07-02 6 views

Respuesta

7

Están comprobando lo mismo, pero PUEDEN ser significa para verificar cosas diferentes.

If IsNothing(TestString) Then 

Y

If TestString = Nothing Then 

Son prueba diferente - la primera se usa rara vez, porque típicamente del que en realidad sólo quiere saber si tiene un valor no vacío. Pero se puede usar para tratar una cadena vacía y un valor nulo de forma diferente en un DB, o para detectar el uso de un parámetro opcional (ambos casos requieren trabajo adicional para asegurarse de que no se deslice inadvertidamente en un valor incorrecto, por lo tanto frágil).

En el ejemplo dado, la prueba es en realidad un poco prolijo y confuso, si eso es lo que desea probar entonces Si String.IsNullOrEmpty (TestString) Entonces

es la manera de hacerlo. Si ese "y" se suponía que era un "o", podría tener sentido haber utilizado IsNothing (TestString).

14

Nothing serían ninguna cadena en absoluto (null en otros idiomas), que es diferente a una cadena vacía (""), que en realidad es una cadena.

Sin embargo, la verificación debe reemplazarse por If Not String.IsNullOrEmpty(TestString) Then, lo que deja en claro qué es exactamente lo que está haciendo.

Acabo de jugar con esto en LINQPad, y encontré algo ligeramente sorprendente. En VB.NET:

Dim s1 as string = Nothing 
Dim s2 as string = "" 

Console.WriteLine(s1 is Nothing) 'True 
Console.WriteLine(s2 is Nothing) 'False 

Console.WriteLine(s1 = "") 'True 
Console.WriteLine(s2 = "") 'True 

Console.WriteLine(string.IsNullOrEmpty(s1)) 'True 
Console.WriteLine(string.IsNullOrEmpty(s2)) 'True 

en C#:

string s1 = null; 
string s2 = ""; 

Console.WriteLine(s1 == null); //True 
Console.WriteLine(s2 == null); //False 

Console.WriteLine(s1 == ""); //False 
Console.WriteLine(s2 == ""); //True 

Console.WriteLine(string.IsNullOrEmpty(s1)); //True 
Console.WriteLine(string.IsNullOrEmpty(s2)); //True 

no estaba bastante esperaba eso. Parece que VB.Net trata un Nothing como una cadena vacía. Supongo que es compatible con las versiones anteriores de VB.

Esto refuerza todo lo que debería usar String.IsNullOrEmpty para este tipo de comprobaciones, ya que es más explícito lo que está comprobando y funciona como se esperaba.

+1

+1 me robó las palabras de la boca. Erich, si una cadena no se ha establecido, es Nothing, si una cadena es = "" está vacía. –

+0

Estoy totalmente confundido. En MSDN dice que para variables de tipo String en VB, Nothing = "". Si ese es el caso, parece que lo anterior es redundante –

+1

Supongo que fue hecho por alguien que estaba más familiarizado con C#, que tiene un comportamiento diferente, y no sabe acerca de IsNullOrEmpty. –

3

Sí, por definición, en VB.NET "" es equivalente a Nothing incluso para =, <> y todos VB funciones; a menos que explícitamente le importe la diferencia, como al marcar con Is.

Por supuesto, verá diferencias al usar las funciones generales de .NET y especialmente los métodos en los que str.Method fallarán con una excepción de referencia nula.

BTW Supongo que el extracto en el OP es código C# (mal) convertido.

Cuestiones relacionadas