Nada = string.empty (por que esses são iguais?)
Pergunta
Por que a primeira declaração se avalia para verdadeira? Eu sei que se eu usar "é" em vez de "=", isso não será avaliado como verdadeiro. Se eu substituir String.Empty por "Foo", ele não avaliará como verdadeiro. String.Empty e "Foo" têm o mesmo tipo de string, então por que um avalia para verdadeiro e o outro não?
//this evaluates to true
If Nothing = String.Empty Then
End If
//this evaluates to false
If Nothing = "Foo" Then
End If
Solução
Nada no vb.net é o valor padrão para um tipo. o especificação de idioma Diz na Seção 2.4.7:
Nada é um literal especial; Ele não possui um tipo e é conversível para todos os tipos no sistema de tipos, incluindo parâmetros de tipo. Quando convertido em um tipo específico, é o equivalente ao valor padrão desse tipo.
Portanto, quando você testa contra String.Empty, nada é convertido em uma string, que tem um comprimento 0. O operador IS deve ser usado para testar nada, e String.Empty.Equals (nada) também retornará false.
Outras dicas
É um caso especial de VB's =
e <>
operadores.
o Especificação de idioma Estados na Seção 11.14:
Ao fazer uma comparação de string, uma referência nula é equivalente ao literal de strings "".
Se você estiver interessado em mais detalhes, escrevi uma comparação detalhada de vbNullString
, String.Empty
, ""
e Nothing
em vb.net aqui:
Experimente isso:
Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))
o =
O operador não aplica tipos iguais, enquanto o .Equals()
método de um objeto de string, assim como o Is
operador.
Relacionado a este tópico, se você usar uma variável de string inicializada com "nada" a ser atribuída à propriedade "Valor" de um SQLParameter que o parâmetro é ignorado, não incluído no comando enviado ao servidor, e um erro de parâmetro ausente é lançado . Se você inicializar essa variável com String.Empty, tudo corre bem.
//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