?. and ? () operator null-conditional (Visual Basic)
Menguji nilai operand sebelah kiri untuk null (Nothing
) sebelum melakukan operasi akses anggota (?.
) atau indeks (?()
) ; mengembalikan Nothing
jika operand sebelah kiri mengevaluasi ke Nothing
. Perhatikan bahwa dalam ekspresi yang biasanya mengembalikan jenis nilai, operator bersyarah-null mengembalikan Nullable<T>.
Operator ini membantu Anda menulis lebih sedikit kode untuk menangani pemeriksaan null, terutama untuk 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 bersyarah-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 berupa null, berdasarkan nilai anggota Boolean pada objek tersebut (seperti properti Boolean IsAllowedFreeShipping
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 dan menghindari pemeriksaan null secara manual dengan menggunakan operator bersyarah-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 bersyarah dan operasi indeks mengembalikan Nothing
, sisa eksekusi rantai itu akan berhenti. Dalam contoh berikut, C(E)
tidak dievaluasi jika A
, B
, atau C
dievaluasi 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 menentukan dua jenis, NewsBroadcaster
dan NewsReceiver
. Item berita dikirim ke penerima oleh delegasi 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
Jika tidak ada elemen dalam daftar pemanggilan SendNews
, delegasi SendNews
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 ini jauh lebih sederhana:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
Cara barunya adalah aman-utas karena kompiler menghasilkan kode untuk mengevaluasi SendNews
satu kali saja, menjaga hasilnya dalam variabel sementara. Anda perlu secara eksplisit memanggil metode Invoke
karena tidak ada sintaks SendNews?(String)
pemanggilan delegasi null-conditional.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk