Bagikan melalui


Jenis Nilai yang Dapat Diubah ke Null (Visual Basic)

Terkadang Anda bekerja dengan jenis nilai yang tidak memiliki nilai yang ditentukan dalam keadaan tertentu. Misalnya, bidang dalam database mungkin harus membedakan antara memiliki nilai yang ditetapkan yang bermakna dan tidak memiliki nilai yang ditetapkan. Jenis nilai dapat diperluas untuk mengambil nilai normal atau nilai null. Ekstensi semacam itu disebut jenis yang dapat diubah ke null/nullable.

Setiap jenis nilai yang dapat diubah ke null dibangun dari struktur generik Nullable<T>. Pertimbangkan database yang melacak aktivitas terkait pekerjaan. Contoh berikut membuat jenis nullable Boolean dan mendeklarasikan variabel dari jenis tersebut. Anda dapat menulis deklarasi dengan tiga cara:

Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

Variabel ridesBusToWork dapat menyimpan nilai True, nilai False, atau tanpa nilai sama sekali. Nilai default awalnya tidak ada nilai sama sekali, yang dalam hal ini bisa berarti bahwa informasi belum diperoleh untuk orang ini. Sebaliknya, False bisa berarti bahwa informasi telah diperoleh dan orang tersebut tidak naik bus untuk bekerja.

Anda dapat mendeklarasikan variabel dan properti dengan jenis nilai yang dapat diubah ke null, dan Anda dapat mendeklarasikan array dengan elemen jenis nilai nullable. Anda dapat mendeklarasikan prosedur dengan jenis nilai nullable sebagai parameter, dan Anda dapat mengembalikan jenis nilai nullable dari prosedur Function.

Anda tidak dapat membuat jenis yang dapat diubah ke null pada jenis referensi seperti array, String, atau kelas. Jenis yang mendasar harus merupakan jenis nilai. Untuk informasi selengkapnya, lihat Jenis Nilai dan Jenis Referensi.

Menggunakan Variabel Tipe Nullable

Anggota terpenting dari jenis nilai yang dapat diubah ke null adalah properti HasValue dan Value. Untuk variabel jenis nilai yang dapat diubah ke null, HasValue memberi tahu Anda apakah variabel berisi nilai yang ditentukan. Jika HasValue adalah True, Anda dapat membaca nilai dari Value. Perhatikan bahwa HasValue dan Value merupakan properti ReadOnly.

Nilai Default

Saat Anda mendeklarasikan variabel dengan jenis nilai nullable, properti HasValue memiliki nilai default False. Ini berarti bahwa secara default variabel tidak memiliki nilai yang ditentukan, bukan nilai default dari jenis nilai yang mendasarnya. Dalam contoh berikut, variabel numberOfChildren awalnya tidak memiliki nilai yang ditentukan, meskipun nilai default jenis Integer adalah 0.

Dim numberOfChildren? As Integer

Nilai null berguna untuk menunjukkan nilai yang tidak ditentukan atau tidak diketahui. Jika numberOfChildren telah dinyatakan sebagai Integer, tidak akan ada nilai yang dapat menunjukkan bahwa informasi saat ini tidak tersedia.

Menyimpan Nilai

Anda menyimpan nilai dalam variabel atau properti dari jenis nilai nullable dengan cara yang khas. Contoh berikut menetapkan nilai ke variabel numberOfChildren yang dideklarasikan dalam contoh sebelumnya.

numberOfChildren = 2

Jika variabel atau properti dari jenis nilai nullable berisi nilai yang ditentukan, Anda dapat menyebabkannya kembali ke status awal tidak memiliki nilai yang ditetapkan. Anda melakukan ini dengan mengatur variabel atau properti ke Nothing, seperti yang ditunjukkan contoh berikut.

numberOfChildren = Nothing

Catatan

Meskipun Anda dapat menetapkan Nothing ke variabel jenis nilai nullable, Anda tidak dapat menguji Nothing menggunakan tanda sama dengan. Perbandingan yang menggunakan tanda sama dengan, someVar = Nothing, selalu mengevaluasi ke Nothing. Anda dapat menguji properti variabel HasValue untuk False, atau menguji dengan menggunakan operator Is atau IsNot.

Mengambil Nilai

Untuk mengambil nilai variabel dari jenis nilai yang dapat diubah ke null, Anda harus terlebih dahulu menguji properti HasValue untuk mengonfirmasi bahwa variabel tersebut memiliki nilai. Jika Anda mencoba membaca nilai saat HasValue adalah False, Visual Basic melempar pengecualian InvalidOperationException. Contoh berikut menunjukkan cara yang disarankan untuk membaca variabel numberOfChildren dari contoh sebelumnya.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Membandingkan Jenis Nullable

Saat variabel nullable Boolean digunakan dalam ekspresi Boolean, hasilnya dapat berupa True, False, atau Nothing. Berikut ini adalah tabel kebenaran untuk And dan Or. Karena b1 dan b2 sekarang memiliki tiga nilai yang mungkin, ada sembilan kombinasi untuk dievaluasi.

b1 b2 b1 And b2 b1 Or b2
Nothing Nothing Nothing Nothing
Nothing True Nothing True
Nothing False False Nothing
True Nothing Nothing True
True True True True
True False False True
False Nothing False Nothing
False True False True
False False False False

Saat nilai variabel atau ekspresi Boolean adalah Nothing, itu bukan true atau false. Pertimbangkan contoh berikut.

Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If

Dalam contoh ini, b1 And b2 mengevaluasi ke Nothing. Akibatnya, Else klausul dijalankan di setiap If pernyataan, dan outputnya adalah sebagai berikut:

Expression is not true

Expression is not false

Catatan

AndAlso dan OrElse, yang menggunakan evaluasi sirkuit pendek, harus mengevaluasi operan kedua mereka saat pertama mengevaluasi ke Nothing.

Propagasi

Jika salah satu atau kedua operan dari operasi aritmatika, perbandingan, pergeseran, atau jenis adalah jenis nilai yang dapat diubah ke null, hasil operasi juga merupakan jenis nilai yang dapat diubah ke null. Jika kedua operan memiliki nilai yang bukan Nothing, operasi dilakukan pada nilai yang mendasar dari operand, seolah-olah tidak ada jenis nilai yang dapat diubah ke null. Dalam contoh berikut, variabel compare1 dan sum1 ditik secara implisit. Jika Anda mengarahkan penunjuk mouse ke atasnya, Anda akan melihat bahwa compiler menyimpulkan jenis nilai yang dapat diubah ke null untuk keduanya.

' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3 > 2, but compare1 is inferred to be of 
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")

Jika satu atau kedua operan memiliki nilai Nothing, hasilnya adalah Nothing.

' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays: 3 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")

Menggunakan Jenis Nullable dengan Data

Database adalah salah satu tempat terpenting untuk menggunakan jenis nilai yang dapat diubah ke null. Tidak semua objek database saat ini mendukung jenis nilai yang dapat diubah ke null, tetapi adaptor tabel yang dihasilkan perancang mendukungnya. Lihat Dukungan TableAdapter untuk jenis yang nullable.

Lihat juga