Megosztás a következőn keresztül:


?. É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, 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 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 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).

Lásd még