?. Ve? () null koşullu işleçler (Visual Basic)

Üye erişimi () veya dizin?() (Nothing) işlemi gerçekleştirmeden önce sol işlenenin değerini null (?.) olarak test eder; soldaki işlenen olarak değerlendirilirse NothingdöndürürNothing. Normalde değer türleri döndüren ifadelerde null-koşullu işlecin bir Nullable<T>döndürdüğüne dikkat edin.

Bu işleçler, özellikle veri yapılarına inerken null denetimleri işlemek için daha az kod yazmanıza yardımcı olur. Örneğin:

' 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()

Karşılaştırma için, null koşullu işleç olmadan bu ifadelerden ilkinin alternatif kodu:

Dim length As Integer?
If customers IsNot Nothing Then
   length = customers.Length
Else
    length = Nothing
End If

Bazen null olabilecek bir nesne üzerinde, bu nesnedeki boole üyesinin değerine göre (aşağıdaki örnekteki Boole özelliği IsAllowedFreeShipping gibi) bir eylem gerçekleştirmeniz gerekir:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
  ApplyFreeShippingToOrders(customer)
End If

Aşağıdaki gibi null-koşullu işlecini kullanarak kodunuzu kısaltabilir ve null denetimini el ile yapmaktan kaçınabilirsiniz:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Null koşullu işleçler kısa devredir. Koşullu üye erişimi ve dizin işlemleri zincirindeki bir işlem döndürürse Nothing, zincirin yürütmesinin geri kalanı durdurulur. Aşağıdaki örnekte, C(E) , Bveya C olarak değerlendirilirse AdeğerlendirilmezNothing.

A?.B?.C?(E)

veya olarak Boolean? değerlendirilen başka bir değer veya HasValue=falsedeğerine nothing sahipse Not someStr?.Contains("some string") bloğunun else çalıştırıldığını unutmayın. Değerlendirme, null/hiçbir şeyin hiçbir şeye eşit olmadığı, başka bir null/hiçbir şeyin olmadığı SQL değerlendirmesini izler.

Null koşullu üye erişimi için başka bir kullanım, temsilcileri çok daha az kodla iş parçacığı güvenli bir şekilde çağırmaktır. Aşağıdaki örnek, bir NewsBroadcaster ve NewsReceiverolmak üzere iki tür tanımlar. Haber öğeleri, temsilci tarafından alıcıya NewsBroadcaster.SendNews gönderilir.

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

Çağırma listesinde öğe SendNews yoksa, SendNews temsilci bir NullReferenceExceptionoluşturur. Null koşullu işleçlerden önce, aşağıdaki gibi kod temsilci çağırma listesinin olmamasını Nothingsağlardı:

SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
   SendNews("Just in...")
End If

Yeni yöntem çok daha basittir:

SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")

Derleyici, sonucu geçici bir değişkende tutarak yalnızca bir kez değerlendirmek SendNews için kod oluşturduğundan yeni yol iş parçacığı açısından güvenlidir. Null koşullu temsilci çağırma söz dizimi SendNews?(String)olmadığından yöntemini açıkça çağırmanız Invoke gerekir.

Ayrıca bkz.