Apakah ada cara mudah dalam C # untuk memeriksa untuk melihat apakah instance DateTime telah diberi nilai atau tidak?
131
Satu-satunya cara untuk memiliki variabel yang belum diberi nilai dalam C # adalah untuk itu menjadi variabel lokal - dalam hal ini pada saat kompilasi Anda dapat mengatakan bahwa itu tidak ditentukan dengan mencoba membaca dari itu: )
Saya menduga Anda benar-benar ingin Nullable<DateTime>
(atau DateTime?
dengan gula sintaksis C #) - buatlah null
untuk memulainya dan kemudian berikan DateTime
nilai normal (yang akan dikonversi dengan tepat). Kemudian Anda bisa membandingkan dengan null
(atau menggunakan HasValue
properti) untuk melihat apakah nilai "nyata" telah ditetapkan.
default(DateTime)
dan yang hanya seperti itu untuk memulai. Pada dasarnya itu memperlakukan satu nilai dalam domain sebagai "khusus dan tidak tersedia untuk penggunaan normal" yang saya sukai.maksud Anda seperti itu:
atau Anda bisa menggunakan Nullable
sumber
letakkan ini di suatu tempat:
kemudian:
sumber
IsEmpty
metode Anda akan mengembalikan true, yang mungkin bukan yang Anda inginkan (karena itu tidak kosong - ini telah ditetapkan nilai default). Saya kira nama metode Anda akan lebih cocok sebagaiIsDefaultValue
. Karena Anda tidak bisa benar-benar memiliki DateTime yang tidak dapat dibatalkan ituIsEmpty
.IsDefaultValue
akan lebih baikDateTime adalah tipe nilai, jadi tidak mungkin nol. Jika Anda berpikir DateTime? (Tidak dapat dibatalkan), Anda dapat menggunakan:
sumber
Saya baru tahu bahwa GetHashCode () untuk datetime yang belum ditetapkan selalu nol. Saya tidak yakin apakah ini cara yang baik untuk mengecek null datetime, karena, saya tidak dapat menemukan dokumentasi tentang mengapa perilaku ini ditampilkan.
sumber
GetHashCode
kembali 0 karena kutu (representasi internal dari DateTime) juga sama dengan 0. kode Hash dihitung dengan cara berikut:unchecked((int)ticks) ^ (int)(ticks >> 32);
. Lihat juga di sini: Referenceource.microsoft.com/#mscorlib/system/datetime.cs.836Gunakan
Nullable<DateTime>
jika memungkinkan.sumber
Saya akan mengatakan nilai default selalu
new DateTime()
. Jadi kita bisa menulissumber
Saya biasanya lebih suka, jika memungkinkan, untuk menggunakan nilai default tipe nilai untuk menentukan apakah mereka telah ditetapkan. Ini jelas tidak mungkin sepanjang waktu, terutama dengan int - tetapi untuk DateTimes, saya pikir pemesanan MinValue untuk menandakan bahwa itu belum diubah cukup adil. Manfaat dari ini lebih dari nullables adalah bahwa ada satu tempat lebih sedikit di mana Anda akan mendapatkan pengecualian referensi nol (dan mungkin banyak tempat di mana Anda tidak perlu memeriksa nol sebelum mengaksesnya!)
sumber
Jika Anda tidak ingin khawatir tentang masalah nilai Null seperti memeriksa null setiap kali Anda menggunakannya atau membungkusnya dalam beberapa logika, dan Anda juga tidak ingin harus khawatir tentang masalah waktu offset, maka ini adalah bagaimana saya memecahkan masalah:
Saya hanya memeriksa bahwa nilai defaultnya kurang dari satu hari setelah awal waktu. Bekerja seperti pesona.
sumber