Dalam. NET, ada dua kategori tipe: referensi dan nilai (int, dobel, struct, enums dll). Di antara perbedaan mereka adalah fakta bahwa referensi bisa jadi null
, sedangkan nilai tidak bisa. Jadi, jika Anda memiliki tipe nilai dan ingin menyampaikan semantik "opsional" atau "tidak dikenal", Anda dapat menghiasi itu Nullable<>
. Catatan yang Nullable<>
dibatasi oleh tipe untuk menerima hanya tipe nilai (memiliki where T : struct
klausa). Nullable<>
juga memiliki harga khusus dari kompiler yang null
nilainya dilindungi dari NullReferenceExceptions
:
string x = null;
x.ToString(); // throws a NullReferenceException
int? y = null;
y.ToString(); // returns ""
Dalam bahasa fungsional (seperti Scala, F #, Haskell, Swift dll) itu adalah umum untuk null
untuk tidak ada . Ini karena secara keseluruhan orang menganggap keberadaan null
sebagai ide yang buruk , dan perancang bahasa telah memutuskan untuk mengatasi masalah ini dengan menolaknya.
Ini berarti bahwa sekali lagi kita perlu beberapa cara untuk mewakili nilai dalam bahasa ini. Masukkan Option
tipe (nomenklatur bervariasi, ini disebut Maybe
dalam Haskell). Ini melakukan pekerjaan yang mirip dengan Nullable
yang membungkus jenis untuk menambahkan kasus di mana nilainya "Tidak Ada" atau "Tidak Diketahui" dll.
Perbedaan sebenarnya ada pada fungsi tambahan yang diberikan kepada Anda oleh bahasa yang menerapkan Option
. Sebagai contoh, ambil Option.map
(dalam pseudocode):
function Option<T2> Option.map(opt: Option<T1>, mapFunc: T1 -> T2) {
if (opt is None) return None
else return Option<T2>(mapFunc(opt.Value))
}
Fungsi perangkaian seperti Option.map
ini adalah cara yang ampuh untuk menghindari pelat pelat nol yang biasa Anda lihat di mana-mana di C #:
if (service == null)
return null;
var x = service.GetValue();
if (x == null || x.Property == null)
return null;
return x.Property.Value;
Setara Nullable dalam C # adalah:
public static Nullable<T2> Map<T1, T2>(this Nullable<T1> nullable, Func<T1, T2> f)
where T1 : struct
where T2 : struct
{
if (!nullable.HasValue) return (T2?)null;
else return (T2?) f(nullable.Value);
}
Namun ini memiliki utilitas terbatas dalam C # karena hanya akan bekerja untuk tipe nilai.
Versi baru C # menawarkan operator "null propagation" ( ?.
) yang mirip dengan Option.map
fungsi kecuali hanya berlaku untuk metode dan pengakses properti. Sampel di atas akan ditulis ulang
return service?.GetValue()?.Property?.Value;