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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top