?. 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