Swift punya Optionals
. C # memiliki Nullable
tipe.
Sejauh yang saya tahu keduanya melayani tujuan yang sama, selain nilai beberapa jenis mereka menyimpan informasi apakah variabel memiliki nilai atau tidak didefinisikan (tidak diinisialisasi).
Pertanyaannya, apakah Optionals
hanya Nullable
tipe dengan nama yang berbeda atau ada perbedaan konseptual lainnya?
Dengan kata lain, berbicara tentang konsep itu sendiri, atau dalam konteks bahasa yang tidak memiliki Optionals
atau Nullables
, apakah penting istilah mana yang digunakan?
Ketika menerapkan fungsionalitas itu dalam bahasa apakah masalah apakah saya nama tipe Optionals<T>
atauNullable<T>
object-oriented
programming-languages
terminology
Dalija Prasnikar
sumber
sumber
Jawaban:
Ada konotasi yang berbeda, meskipun mereka bekerja sangat mirip. Semua orang kecuali Microsoft (masukkan eye-roll di sini) menggunakan
null
dannullable
hanya dalam konteks referensi.Options
danMaybes
umumnya dipahami merujuk pada referensi dan nilai, terutama dalam bahasa pemrograman fungsional di mana transparansi referensial berarti tidak ada banyak perbedaan antara nilai dan referensi.Options
adalah istilah yang paling sedikit menyebabkan kebingungan di antara khalayak luas. Hanya pemrogram C # yang akan menganggapNullable
berpotensi menerapkan ke jenis nilai, dan saya pikir sebagian besar dari mereka setidaknya menyadari apaOption
itu.sumber
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 ituNullable<>
. Catatan yangNullable<>
dibatasi oleh tipe untuk menerima hanya tipe nilai (memilikiwhere T : struct
klausa).Nullable<>
juga memiliki harga khusus dari kompiler yangnull
nilainya dilindungi dariNullReferenceExceptions
:Dalam bahasa fungsional (seperti Scala, F #, Haskell, Swift dll) itu adalah umum untuk
null
untuk tidak ada . Ini karena secara keseluruhan orang menganggap keberadaannull
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 disebutMaybe
dalam Haskell). Ini melakukan pekerjaan yang mirip denganNullable
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, ambilOption.map
(dalam pseudocode):Fungsi perangkaian seperti
Option.map
ini adalah cara yang ampuh untuk menghindari pelat pelat nol yang biasa Anda lihat di mana-mana di C #:Setara Nullable dalam C # adalah:
Namun ini memiliki utilitas terbatas dalam C # karena hanya akan bekerja untuk tipe nilai.
Versi baru C # menawarkan operator "null propagation" (
?.
) yang mirip denganOption.map
fungsi kecuali hanya berlaku untuk metode dan pengakses properti. Sampel di atas akan ditulis ulangsumber
null
bukan nilai yang valid untuk tipe F #.