?. E? () Operatori condizionali Null (Visual Basic)
Verifica il valore dell'operando di sinistra per null (Nothing
) prima di eseguire un'operazione di accesso ai membri (?.
) o indice (?()
). Restituisce Nothing
se l'operando di sinistra restituisce Nothing
. Si noti che nelle espressioni che restituiscono in genere tipi di valore, l'operatore condizionale Null restituisce un oggetto Nullable<T>.
Questi operatori consentono di scrivere meno codice per gestire i controlli Null, in particolare in caso di decrescente nelle strutture di dati. Ad esempio:
' Nothing if customers is Nothing
Dim length As Integer? = customers?.Length
' Nothing if customers is Nothing
Dim first As Customer = customers?(0)
' Nothing if customers, the first customer, or Orders is Nothing
Dim count As Integer? = customers?(0)?.Orders?.Count()
Per il confronto, il codice alternativo per la prima di queste espressioni senza un operatore condizionale Null è:
Dim length As Integer?
If customers IsNot Nothing Then
length = customers.Length
Else
length = Nothing
End If
A volte è necessario eseguire un'azione su un oggetto che può essere Null, in base al valore di un membro booleano su tale oggetto (ad esempio la proprietà IsAllowedFreeShipping
booleana nell'esempio seguente):
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
ApplyFreeShippingToOrders(customer)
End If
È possibile abbreviare il codice ed evitare di verificare manualmente la presenza di valori Null usando l'operatore condizionale Null come indicato di seguito:
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)
Gli operatori condizionali Null causano corto circuiti. Se un'operazione in una catena di operazioni di accesso condizionale e indice restituisce Nothing
, il resto dell'esecuzione della catena si arresta. Nell'esempio C(E)
seguente non viene valutato se A
, B
o C
restituisce Nothing
.
A?.B?.C?(E)
Si noti che se Not someStr?.Contains("some string")
o qualsiasi altro valore che restituisce il Boolean?
valore di nothing
o HasValue=false
, il else
blocco viene eseguito. La valutazione segue la valutazione SQL in cui null/nothing non è uguale a nulla, non anche un altro null/nothing.
Un altro uso per l'accesso ai membri condizionali Null consiste nel richiamare delegati in modo thread-safe con molto meno codice. Nell'esempio seguente vengono definiti due tipi, un NewsBroadcaster
e un oggetto NewsReceiver
. Gli elementi di notizie vengono inviati al destinatario dal NewsBroadcaster.SendNews
delegato.
Public Module NewsBroadcaster
Dim SendNews As Action(Of String)
Public Sub Main()
Dim rec As New NewsReceiver()
Dim rec2 As New NewsReceiver()
SendNews?.Invoke("Just in: A newsworthy item...")
End Sub
Public Sub Register(client As Action(Of String))
SendNews = SendNews.Combine({SendNews, client})
End Sub
End Module
Public Class NewsReceiver
Public Sub New()
NewsBroadcaster.Register(AddressOf Me.DisplayNews)
End Sub
Public Sub DisplayNews(newsItem As String)
Console.WriteLine(newsItem)
End Sub
End Class
Se nell'elenco SendNews
chiamate non sono presenti elementi, il SendNews
delegato genera un'eccezione NullReferenceException. Prima degli operatori condizionali Null, il codice simile al seguente ha verificato che l'elenco chiamate del delegato non Nothing
fosse :
SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
SendNews("Just in...")
End If
Ora tutto è molto più semplice:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
Il codice creato in questo modo è thread-safe perché il compilatore genera il codice per valutare SendNews
una sola volta, mantenendo il risultato in una variabile temporanea. È necessario chiamare esplicitamente il metodo Invoke
perché non esiste una sintassi di chiamata dei delegati con condizione Null SendNews?(String)
.
Vedi anche
Commenti e suggerimenti
Invia e visualizza il feedback per