Bagikan melalui


?. dan? () 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 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 .

Lihat juga