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
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top