Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A taghozzáférési () vagy indexelési (?()?.) művelet végrehajtása előtt megvizsgálja a bal oldali operandus értékét null (Nothing) értékre; akkor adja visszaNothing, ha a bal oldali operandus kiértékeli a következőtNothing: . Vegye figyelembe, hogy az olyan kifejezésekben, amelyek általában értéktípusokat adnak vissza, a null-feltételes operátor egy Nullable<T>értéket ad vissza.
Ezek az operátorok segítenek kevesebb kódot írni a null ellenőrzések kezeléséhez, különösen akkor, ha adatstruktúrákba ereszkednek. Például:
' 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()
Összehasonlításképpen az első null feltételes operátor nélküli kifejezések alternatív kódja a következő:
Dim length As Integer?
If customers IsNot Nothing Then
length = customers.Length
Else
length = Nothing
End If
Néha olyan objektumon kell műveletet elvégeznie, amely null értékű lehet az adott objektum logikai tagjának értéke alapján (például a következő példában szereplő logikai tulajdonság IsAllowedFreeShipping ):
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
ApplyFreeShippingToOrders(customer)
End If
Lerövidítheti a kódot, és elkerülheti a null érték manuális ellenőrzését a null-feltételes operátor használatával az alábbiak szerint:
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)
A null feltételes operátorok rövidzárolást jelentenek. Ha a feltételes taghozzáférési és indexelési műveletek láncának egyik művelete visszatér Nothing, a lánc többi művelete leáll. A következő példában a függvény nem értékeli ki az C(E) if A, Bvagy C a kiértékelt értéket Nothing.
A?.B?.C?(E)
Vegye figyelembe, hogy ha Not someStr?.Contains("some string") a kiértékelt Boolean? érték vagy bármely más érték a blokk értékével vagy nothingértékével HasValue=false rendelkezik, akkor a else blokk lefut. A kiértékelés az SQL-értékelést követi, ahol a null/semmi nem egyenlő semmivel, még egy null/semmivel sem.
A null feltételes tagok elérésének másik módja a meghatalmazottak meghívása szálbiztos módon, sokkal kevesebb kóddal. Az alábbi példa két típust határoz meg: a NewsBroadcaster és a NewsReceiver. A hírelemeket a meghatalmazott küldi el a fogadónak NewsBroadcaster.SendNews .
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
Ha a meghívási listában nincsenek elemek SendNews , a SendNews meghatalmazott egy NullReferenceException. A null feltételes operátorok előtt az alábbihoz hasonló kód gondoskodott arról, hogy a delegált meghívási lista ne Nothinglegyen:
SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
SendNews("Just in...")
End If
Az új módszer sokkal egyszerűbb:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
Az új módszer a szálvédettség, mivel a fordító csak egy alkalommal hoz létre kódot SendNews , és az eredményt ideiglenes változóban tartja. Explicit módon kell meghívnia a Invoke metódust, mert nincs null-feltételes delegálási hívás szintaxisa SendNews?(String).