Apakah jenis referensi jenis yang dapat dibatalkan?


135

Ketika saya mendeklarasikan intsebagai nullable

int? i=null;

Apakah di isini menjadi tipe referensi?

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 #)


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.


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.


6

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.