Apa nilai default dari tipe nullable "int?" (termasuk tanda tanya)?

100

Di C #, apa nilai default dari variabel contoh kelas tipe int??

Misalnya, dalam kode berikut, nilai apa yang akan MyNullableIntdimiliki jika tidak pernah ditetapkan secara eksplisit?

class MyClass
{
    public int? MyNullableInt;
}

(Sepertinya jawabannya hampir pasti salah satunya nullatau 0, tapi yang mana itu?)

Jon Schneider
sumber
9
Mengapa suara negatifnya? (Jawaban atas pertanyaan ini awalnya tidak jelas bagi saya tanpa benar-benar menjalankan kode untuk menguji perilaku tersebut; dan yang mengejutkan, saya tidak dapat menemukan duplikat dari pertanyaan ini di StackOverflow, atau dapat ditemukan dengan mudah di tempat lain melalui Google.)
Jon Schneider
1
Anda bisa saja melihat di sini - google hit pertama untuk saya.
500 - Kesalahan Server Internal
2
@ 500 - Saya menemukan artikel itu ketika saya sedang meneliti - Saya benar-benar menautkannya dalam jawaban saya sendiri di bawah - tetapi sejauh yang saya tahu, artikel tersebut tidak secara eksplisit menyatakan bahwa nilai default dari contoh tipe nullable adalah nol. Ini tidak mengatakan "Nilai default untuk HasValue adalah palsu. Nilai properti tidak memiliki nilai default", tapi itu tidak langsung menjawab pertanyaan asli saya tanpa beberapa menggali tambahan.
Jon Schneider
2
Saya bertanya-tanya apakah itu karena Anda bisa mengatur breakpoint dan melihat apa nilainya, atau di tipe Immediate Window int? x;dan melihat apa hasilnya?
Rufus L

Jawaban:

135

Nilai default untuk int?- dan untuk semua jenis nullable yang menggunakan "tipe?" deklarasi - adalah null.

Mengapa ini terjadi:

  • int?adalah gula sintaksis untuk tipe Nullable <T> (di mana T adalah int), sebuah struct. ( referensi )
  • The Nullable<T>jenis memiliki HasValue bool anggota, yang ketika false, membuat Nullable<T>contoh "bertindak seperti" sebuah nullnilai. Secara khusus, metode Nullable <T> .Equals diganti untuk ditampilkan truesaat Nullable<T>with HasValue == falsedibandingkan dengan nullnilai sebenarnya .
  • Dari C # Language Specification 11.3.4 , nilai default awal instance struct adalah semua bidang jenis nilai struct yang disetel ke nilai defaultnya, dan semua bidang jenis referensi struct disetel ke null.
  • Nilai default boolvariabel di C # adalah false ( referensi ). Oleh karena itu, HasValueproperti dari sebuah Nullable<T>instance default adalah false; yang pada gilirannya membuat Nullable<T>instance itu sendiri bertindak seperti itu null.
Jon Schneider
sumber
Ketika saya mengubah deklarasi dari int? x = null;menjadi int? x;, saya mendapatkan kesalahan kompiler lebih jauh di dalam kode: "Penggunaan variabel lokal x yang tidak ditetapkan".
John Pick
1
@JohnPick Itu adalah fitur kompilator C # yang dimaksudkan untuk mencegah bug yang mungkin timbul dari Anda "lupa" untuk menginisialisasi variabel sebelum menggunakannya. Situasi saat Anda dapat menemukan pengantara yang tidak diinisialisasi? adalah ketika variabel anggota kelas. Contoh keduanya di sini: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
Jon Schneider
Jadi pada dasarnya tempat ini adalah blog teknologi Anda? Anda mengajukan pertanyaan yang Anda hanya perlu menjalankan kode untuk mendapatkan jawabannya, lalu menjawab sendiri pertanyaan itu di menit yang sama.
GôTô
4
@JonSchneider cukup adil, saya buruk saat itu
GôTô
VS ini compiler petunjuk / peringatan menyesatkan: Field 'id' is never assigned to, and will always have its default value 0. Aneh bukan?
Hendy Irawan
30

Saya merasa penting untuk membagikan Nullable<T>.GetValueOrDefault()metode yang sangat berguna saat bekerja dengan perhitungan matematika yang menggunakan nilai Nullable<int>alias int?. Ada kalanya Anda tidak perlu memeriksa HasValueproperti dan Anda dapat menggunakan GetValueOrDefault()saja.

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

Baris perintah yang menunjukkan kode di atas berfungsi

Brian Ogden
sumber
0
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());
Rufus L.
sumber