Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Menguji nilai operand sebelah kiri untuk null (Nothing) sebelum melakukan operasi akses anggota (?.) atau indeks (?()) ; mengembalikan Nothing jika operand sebelah kiri dievaluasi ke Nothing. Perhatikan bahwa dalam ekspresi yang biasanya mengembalikan jenis nilai, operator null-conditional mengembalikan Nullable<T>.
Operator ini membantu Anda menulis lebih sedikit kode untuk menangani pemeriksaan null, terutama saat turun ke struktur data. Contohnya:
' 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()
Sebagai perbandingan, kode alternatif untuk ekspresi pertama ini tanpa operator bersyariah null adalah:
Dim length As Integer?
If customers IsNot Nothing Then
length = customers.Length
Else
length = Nothing
End If
Terkadang Anda perlu mengambil tindakan pada objek yang mungkin null, berdasarkan nilai anggota Boolean pada objek tersebut (seperti properti IsAllowedFreeShipping Boolean dalam contoh berikut):
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
ApplyFreeShippingToOrders(customer)
End If
Anda dapat mempersingkat kode Anda dan menghindari pemeriksaan null secara manual dengan menggunakan operator bersyariah null sebagai berikut:
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)
Operator null-kondisional memiliki sirkuit pendek. Jika satu operasi dalam rantai akses anggota kondisional dan operasi indeks mengembalikan Nothing, sisa eksekusi rantai berhenti. Dalam contoh berikut, C(E) tidak dievaluasi jika A, , Batau C mengevaluasi ke Nothing.
A?.B?.C?(E)
Perhatikan bahwa jika Not someStr?.Contains("some string") atau nilai lain yang mengevaluasi sebagai Boolean? memiliki nilai nothing atau HasValue=false, else blok dijalankan. Evaluasi mengikuti evaluasi SQL di mana null/nothing tidak sama dengan apa pun, bahkan bukan null/tidak sama sekali.
Penggunaan lain untuk akses anggota null-conditional adalah memanggil delegasi dengan cara yang aman utas dengan kode yang jauh lebih sedikit. Contoh berikut mendefinisikan dua jenis, a NewsBroadcaster dan NewsReceiver. Item berita dikirim ke penerima oleh NewsBroadcaster.SendNews delegasi.
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
Jika tidak ada elemen dalam SendNews daftar pemanggilan, SendNews delegasi akan melempar NullReferenceException. Sebelum operator bersyarat null, kode seperti berikut memastikan bahwa daftar pemanggilan delegasi bukan Nothing:
SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
SendNews("Just in...")
End If
Cara baru jauh lebih sederhana:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
Cara baru adalah thread-safe karena pengkompilasi menghasilkan kode untuk mengevaluasi SendNews satu kali saja, menyimpan hasilnya dalam variabel sementara. Anda perlu secara eksplisit memanggil Invoke metode karena tidak ada sintaks SendNews?(String)pemanggilan delegasi null-conditional .