2010-04-13 20 views
24

¿Por qué la primera sentencia if se evalúa como verdadera? Sé que si uso "es" en lugar de "=", entonces no se evaluará como verdadero. Si reemplazo String.Empty con "Foo", no se evalúa como verdadero. Tanto String.Empty como "Foo" tienen el mismo tipo de String, entonces ¿por qué uno evalúa a verdadero y el otro no?Nothing = String.Empty (¿Por qué son iguales?)

//this evaluates to true 
    If Nothing = String.Empty Then 

    End If 

    //this evaluates to false 
    If Nothing = "Foo" Then 

    End If 
+0

¿Está utilizando el método '.Equals()' para comparar? – Amber

+0

Agregué un fragmento de código. En realidad, no necesito hacer una comparación entre cadena nula y vacía, solo tengo curiosidad por saber por qué esa afirmación se evaluó como verdadera. –

Respuesta

21

Nada en VB.net es el valor predeterminado para un tipo. El language spec dice en la sección 2.4.7:

Nada es un literal especial; no tiene un tipo y es convertible a todos los tipos en el sistema de tipos, incluidos los parámetros de tipo. Cuando se convierte a un tipo particular, es el equivalente del valor predeterminado de ese tipo.

Por lo tanto, cuando se prueba contra String.Empty, Nada se convierte en una cadena, que tiene una longitud 0. El operador IS se debe utilizar para las pruebas contra nada, y String.Empty.Equals (Nada) se también devuelve falso.

+0

¿Conoces la razón detrás de la conversión automática de Nothing a una cadena sobre la marcha cuando hago la comparación? ¿Cuál es el beneficio de esto? –

+8

Al usar el operador = con una cadena, VB.NET utiliza StrCmp, en lugar de op_Equality. Especulo que esto fue por razones de compatibilidad hacia atrás. –

+1

Lo que ella quiere decir: VB.NET Nada = predeterminado (T) en C#, no NULO –

2

Prueba esto:

Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing)) 

El operador = no fuerza la igualdad de los tipos, mientras que el método de un objeto de cadena .Equals() hace, como lo hace el operador Is.

2

Relacionado con este tema, si utiliza una variable de cadena inicializada con "nada" para asignar a la propiedad "valor" de un parámetro Sql, ese parámetro se ignora, no se incluye en el comando enviado al servidor y falta error de parámetro lanzado. Si inicializas esa variable con string.empty todo va bien.

//This doesn't work 
Dim myString as String = nothing 
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString 

//This works  
Dim myString as String = string.empty 
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString 
+0

Y justo cuando pensaba que entendía VB.NET ... –

+2

establecía el valor en DBNull.value en lugar de nada –

+0

Señala el problema de que si una biblioteca externa no está escrita en VB, el autor de la biblioteca podría no estar al tanto de la ambigüedad entre nada y cadena vacía en VB. Entonces, cuando se usa en código VB, los usuarios deben tener cuidado al no pasar nada o una cadena vacía. – Gqqnbig

4

Es un caso especial de = y <> operadores de VB.

Los Language Specification estados en la Sección 11.14:

Al hacer una comparación de cadenas, una referencia nula es equivalente a la cadena literal "".

Cuestiones relacionadas