Niente = String.Empty (Perché sono questi uguali?)
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
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