Nada = String.Empty (¿Por qué son estos iguales?)
Pregunta
¿Por qué la primera sentencia if se evalúa como verdadera? Sé que si uso "es" en lugar de "=", entonces no se evaluará como true. Si sustituyo String.Empty con "Foo" que no se evalúa como verdadera. Tanto String.Empty y "Foo" tienen el mismo tipo de cadena, así que ¿Por qué uno se evalúan como verdadero y el otro no?
//this evaluates to true
If Nothing = String.Empty Then
End If
//this evaluates to false
If Nothing = "Foo" Then
End If
Solución
Nada en VB.net es el valor predeterminado para un tipo. La especificación de lenguaje dice en la sección 2.4.7:
Nada es un literal especial; que no tiene un tipo y se puede convertir en todo tipo en el sistema de tipos, incluyendo los parámetros de tipo. Cuando se convierte a un tipo particular, que 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 probar contra nada, y String.Empty.Equals (Nada) también devolverá falso .
Otros consejos
Es un caso especial de los operadores =
y <>
de VB.
El lenguaje de especificación en la Sección 11.14 :
Al hacer una comparación de cadenas, una referencia nula es equivalente a la cadena literal "".
Si está interesado en obtener más información, he escrito una comparación en profundidad de vbNullString
, String.Empty
, ""
y Nothing
en VB.NET aquí:
Prueba esto:
Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))
El operador =
no hace cumplir la igualdad de los tipos, mientras que la .Equals()
método de un objeto de cadena hace, como lo hace el operador Is
.
En relación con este tema, si se utiliza una variable de cadena inicializado con "nada" que se asignará a la propiedad "valor" de un SqlParameter ese parámetro se ignora, no incluido en el comando enviado al servidor, y un parámetro que falta se tira de error. Si inicializa la 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