Jawaban:
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:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
atau Anda bisa menggunakan Nullable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
letakkan ini di suatu tempat:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
kemudian:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
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 sebagai IsDefaultValue
. Karena Anda tidak bisa benar-benar memiliki DateTime yang tidak dapat dibatalkan itu IsEmpty
.
IsDefaultValue
akan lebih baik
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.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
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.836
Saya akan mengatakan nilai default selalu new DateTime()
. Jadi kita bisa menulis
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
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!)
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:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Saya hanya memeriksa bahwa nilai defaultnya kurang dari satu hari setelah awal waktu. Bekerja seperti pesona.