Una delle tante novità del linguaggio introdotte in
VB.NET, in questo momento siamo alla versione
2005, è stata quella dell'operatore
OrElse.
Molto spesso mi è capitato in
VB di dover fare dei controlli con dei banali
IF ... THEN ... ELSE e trovarmi ad affrontare messaggi d'errore del tipo:
"Object reference not set to an instance of an object.".
Mi spiego meglio con due righe di codice, anche se lo scenario ipotizzato non dei più appropriati e, francamente, senza molto senso, ma è solo a titolo di esempio.
Vorrei verificare, alla pressione di un
Button, che il valore
.Text di una
TextBox sia diverso da
"".
Molto semplicemente inserirò all'interno della sub
Button1_Click il codice che fa al caso mio, ad esempio:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If textbox1.Text <> "" Then
MsgBox("ok")
End If
End Sub
Bene.
Ora supponiamo che per un qualsiasi motivo la nostra
TextBox sia a
Nothing, ad esempio perchè l'abbiamo aggiunta a runtime e non l'abbiamo ancora istanziata:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim textbox1 As TextBox = Nothing
If textbox1.Text <> "" Then
MsgBox("ok")
End If
End Sub
In questo caso il nostro codice restituirà un errore e più precisamente
"Object reference not set to an instance of an object."Fin qui tutto ok e corretto: ci siamo dimenticati un controllo e cioè quello che verifica se l'oggetto in questione è a
Nothing.
Provvediamo ad aggiungerlo alla
if:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim textbox1 As TextBox = Nothing
If textbox1 is nothing Or textbox1.Text <> "" Then
MsgBox("ok")
End If
End Sub
Non ci siamo: ancora
"Object reference not set to an instance of an object.".
Con i vecchi sistemi avrei dovuto prima testare se la
TextBox fosse a
Nothing e poi eseguire il controllo sulla poprietà
Text, il tutto con due if distinte:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim textbox1 As TextBox = Nothing
If textbox1 is nothing then
...
Elseif textbox1.Text <> "" Then
MsgBox("ok")
End If
End Sub
Fortunatamente il .NET ci viene incontro fornendoci l'operatore
OrElse che, come citato dalla documentazione ufficiale,
Performs short-circuiting inclusive logical disjunction on two expressions.In parole povere fa quello che tutti si sarebbero sempre aspettati e cioè che se il primo valore non è soddisfatto è inutile passare ad analizzare il secondo!
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim textbox1 As TextBox = Nothing
If textbox1 Is nothing OrElse textbox1.Text = "" Then
MsgBox("ok")
end if
End Sub