?. És? () null feltételes operátorok (Visual Basic)
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élda:
' 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
, B
vagy 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 HasValue=false
értékével nothing
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 Nothing
legyen:
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)
.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: