Tampaknya Nullable<int>
dan int?
nilainya setara. Apakah ada alasan untuk memilih salah satu dari yang lain?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
Tidak ada perbedaan.
int?
hanyalah singkatan dari Nullable<int>
, yang dengan sendirinya merupakan singkatan dari Nullable<Int32>
.
Kode yang dikompilasi akan persis sama dengan yang Anda pilih untuk digunakan.
The
?
bentuk hanya singkatan untuk jenis penuh. Preferensi pribadi adalah satu-satunya alasan untuk memilih satu di antara yang lain.Detail lengkapnya di sini .
sumber
Sementara saya sepenuhnya setuju bahwa dalam kebanyakan kasus mereka adalah sama, saya baru-baru datang di sebuah situasi, ketika ada adalah perbedaan antara kedua. Untuk detail yang mengerikan lihat pertanyaan ini , tetapi untuk memberi Anda contoh singkat di sini:
Baris pertama memberikan pesan kesalahan berikut:
Jika Anda penasaran dengan alasan pasti untuk ini, saya sangat menyarankan Anda untuk memeriksa pertanyaan yang sudah ditautkan , tetapi masalah dasarnya adalah bahwa dalam fase penguraian setelah operator
is
(atauas
), ketika kita menghadapi?
token, kita memeriksa apakah yang berikutnya token dapat diartikan sebagai operator unary (&
bisa jadi satu) dan jika demikian: parser tidak peduli tentang kemungkinan?
token menjadi pengubah tipe, ia hanya menggunakan tipe sebelumnya, dan akan mengurai sisanya seolah-olah?
token adalah operator terner (sehingga penguraian akan gagal).Jadi, meskipun secara umum
int?
danNullable<int>
dapat dipertukarkan, ada beberapa kasus sudut ketika menghasilkan hasil yang sangat berbeda, karena cara parser melihat kode Anda.sumber
test
diperbaiki dengan tanda kurung, jadivar test = (a is int?) & b;
. Bisa juga diperbaiki denganvar test = a is int? && b;
, dan mengingat bahwab
adalah parameter nilai sederhana (tidak ada efek samping pada evaluasi) tampaknya aneh untuk memilih&
lebih&&
.?
adalah karakter kunci.int?
sebagai operasi terner (var test = a is int? <return if true> : <return if false>
), bukan int nullable.bool
kelebihan beban tertentu ini . Ini adalah operator logika Boolean (&
untukbool
) dan operator logika bersyarat Boolean (&&
untukbool
). Perhatikan bagaimana subbagian pertama ini dengan jelas dinamai logis . Ingat, di C # tidak ada konversi ("cast") antarabool
dan tipe numerik!Tampaknya ada perbedaan antara keduanya saat menggunakan pembuatan Code-first Entity Framework (EF):
Ketika entitas Anda berisi properti yang dinyatakan seperti:
EF tidak akan menghasilkan properti nullable dan Anda harus memaksa generator untuk menjadikannya nullable seperti:
Di sisi lain, jika Anda mendeklarasikan entitas Anda seperti:
generator EF akan menghasilkan properti nullable dengan kolom nullable di tabel database terkait.
sumber
Nullable
definisi lain di suatu tempat, karena dengan built-inNullable<T>
, EF tidak mungkin melihat perbedaan antara keduanya. Bahkan jika orang-orang EF ingin memperlakukan mereka secara berbeda, mereka tidak bisa.Nullable adalah tipe generik, tapi int? tidak.
Ada beberapa skenario di mana Nullable harus digunakan melalui int?
misalnya: di sini Anda tidak dapat mengganti Nullable dengan int?
bagaimana Anda bisa mengubah kode di bawah ini tanpa menggunakan Nullable ?
sumber
Nullable<T>
ituNullable<int>