?. 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 Nothing
dö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)
, B
veya C
olarak değerlendirilirse A
değerlendirilmezNothing
.
A?.B?.C?(E)
veya olarak Boolean?
değerlendirilen başka bir değer veya HasValue=false
değ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 NewsReceiver
olmak ü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ı Nothing
sağ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.