Domanda

Perché la prima istruzione if valutare al vero? So che se uso "è" invece di "=" allora non sarà valutata come vera. Se sostituisco String.Empty con "Pippo" che non valuta a true. Sia String.Empty e "Pippo" hanno lo stesso tipo di stringa, quindi Perché si restituiscono true e l'altro no?

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

    End If

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

    End If
È stato utile?

Soluzione

Niente in VB.net è il valore predefinito per un tipo. Il lingua spec dice nella sezione 2.4.7:

  

Niente è un letterale speciale; non ha un tipo ed è convertibile a tutti i tipi nel sistema tipo, compresi i parametri di tipo. Quando convertito in un tipo particolare, è l'equivalente del valore predefinito del tipo.

Quindi, quando si prova contro String.Empty, Nulla è convertito in una stringa, che ha una lunghezza 0. L'operatore is deve essere utilizzato per il test contro il Nulla, e String.Empty.Equals (Niente) tornerà anche falsa .

Altri suggerimenti

E 'un caso speciale di operatori = e <> di VB.

Il linguaggio di specifica stati nella Sezione 11.14 :

  

Quando si effettua un confronto di stringhe, un riferimento null è equivalente alla letterale stringa "".


Se siete interessati a maggiori dettagli, ho scritto un confronto approfondito di vbNullString, String.Empty, "" e Nothing in VB.NET qui:

Prova questo:

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

L'operatore = non applicare tipi uguali, mentre la .Equals() metodo di un oggetto stringa fa, come fa l'operatore Is.

In relazione a questo argomento, se si utilizza una variabile stringa inizializzata con "nulla" da assegnare alla proprietà "valore" di uno SqlParameter tale parametro viene ignorato, non incluso nel comando inviato al server, e un parametro mancante errore viene generato. Se si inizializza la variabile con String.Empty tutto va bene.

//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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top