?. '? () null-koşullu işleçler (Visual Basic)
NothingBir üye erişimi () veya dizin () işlemi gerçekleştirmeden önce, sol taraftaki işlenenin değerini null () için sınar ?. ?() ; Nothing sol taraftaki işlenen olarak değerlendirilirse döndürür Nothing . Normalde değer türlerini döndüren ifadelerde null koşullu işlecin bir döndürür Nullable<T> .
Bu işleçler, özellikle veri yapılarına göre azalan sırada null denetimleri işlemek için daha az kod yazmanıza yardımcı olur. Örnek:
' 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, bu ifadelerin ilki için alternatif kod, null-Conditional işleci olmadan:
Dim length As Integer?
If customers IsNot Nothing Then
length = customers.Length
Else
length = Nothing
End If
Bazen, bu nesnedeki bir Boole üyesinin değerine bağlı olarak null olabilecek bir nesne üzerinde işlem yapmanız gerekir (aşağıdaki örnekteki Boolean özelliği gibi IsAllowedFreeShipping ):
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
ApplyFreeShippingToOrders(customer)
End If
Kodunuzu kısaltabilir ve null koşullu işleci kullanarak null için el ile kontrol edebilirsiniz:
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 devre dışı. Bir koşullu üye erişimi ve dizin işlemleri zincirindeki bir işlem döndürülürse Nothing , zincir yürütmenin geri kalanı duraklar. Aşağıdaki örnekte,,, C(E) A B veya C olarak değerlendirilirse olarak değerlendirilmez Nothing .
A?.B?.C?(E)
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ğırmektir. Aşağıdaki örnek, ve a olmak üzere iki tür tanımlar NewsBroadcaster NewsReceiver . Haber öğeleri, temsilci tarafından alıcıya gönderilir 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
Çağırma listesinde hiç öğe yoksa SendNews , SendNews temsilci bir oluşturur NullReferenceException . Null koşullu işleçlerden önce, aşağıdaki gibi bir kod temsilci çağırma listesi olmadığı için Nothing :
SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
SendNews("Just in...")
End If
Yeni yol çok daha basittir:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
Derleyici yalnızca bir kez değerlendirmek üzere kod oluşturduğundan SendNews ve sonucu geçici bir değişkende tutarak, yeni yöntem iş parçacığı açısından güvenlidir. InvokeNull koşullu temsilci çağırma sözdizimi olmadığından yöntemi açık bir şekilde çağırmanız gerekir SendNews?(String) .