Apakah jenis referensi jenis yang dapat dibatalkan?

135

Ketika saya mendeklarasikan intsebagai nullable

int? i=null;

Apakah di isini menjadi tipe referensi?

Vaibhav Jain
sumber

Jawaban:

136

Tidak, nullable adalah sebuah struct. Apa yang terjadi adalah bahwa nullable struct memiliki dua nilai:

  1. Nilai tipe data ( intuntuk int?, DateTimeuntuk DateTime?, dll.).
  2. Nilai boolean yang memberi tahu jika nilai tipe data telah ditetapkan. ( HasValueadalah properti.)

Saat Anda menetapkan nilai tipe data, struct berubah HasValuemenjadi true.

Jenis yang tidak dapat dihapus (Panduan Pemrograman C #)

kemiller2002
sumber
26

Dari Jenis Nullable (Panduan Pemrograman C #) :

Jenis Nullable adalah contoh dari System. Struct Nullable.

dan

Tipe nullable mewakili variabel tipe-nilai yang dapat diberi nilai nol. Anda tidak dapat membuat jenis yang dapat dibatalkan berdasarkan pada jenis referensi. (Jenis referensi sudah mendukung nilai nol.)

Jadi, tidak, mereka bukan tipe referensi.

ChrisF
sumber
14

Tipe nullable bukanlah tipe nilai atau tipe referensi. Mereka lebih seperti tipe nilai, tetapi memiliki beberapa properti tipe referensi.

Secara alami, jenis yang dapat dibatalkan dapat diatur ke null. Selain itu, tipe nullable tidak dapat memenuhi structbatasan generik . Selain itu, saat Anda mengetikkan jenis yang dapat dibatalkan dengan yang HasValuesama dengan false, Anda mendapatkan nullpointer alih-alih jenis yang dapat dihapus dari kotak (situasi serupa terjadi dengan membuka kotak).

Properti ini membuat tipe nullable tipe tidak bernilai, tetapi mereka juga bukan tipe referensi. Mereka adalah tipe nilai nullable khusus mereka sendiri.

Stephen Cleary
sumber
6

Tidak, tipe Nullable sebenarnya adalah sebuah struct. Runtime akan secara cerdas menangani pengaturan nilai nol untuk Anda, memberikan tampilan jenis referensi, ketika tidak ....

Matthew Abbott
sumber
2
Saya akan meminta 'menangani dengan cerdas', lebih subjektif. Secara pribadi saya menemukan perilaku yang membingungkan dan sering mengganggu.
nicodemus13
0

Anda seharusnya tidak perlu membuat jenis referensi menjadi tipe yang dapat dibatalkan karena Anda dapat memasukkan nol sebagai gantinya.

devlife
sumber