Lebih
DateTime "null" nilai
I've telah mencari banyak tapi tidak't menemukan solusi. Bagaimana anda berurusan dengan DateTime yang harus mampu mengandung uninitialized nilai (setara dengan null)? Saya memiliki kelas yang mungkin memiliki DateTime nilai properti yang ditetapkan atau tidak. Aku berpikir untuk menginisialisasi properti holder ke DateTime.MinValue, yang kemudian bisa dengan mudah diperiksa. Saya kira ini adalah cukup umum pertanyaan, bagaimana anda melakukan itu?
261
15
Untuk normal DateTimes, jika anda don't menginisialisasi mereka di semua maka mereka akan cocok
DateTime.MinValue
, karena itu adalah tipe nilai daripada tipe referensi.Anda juga dapat menggunakan nullable DateTime, seperti ini:
Atau lagi bentuk:
Dan, akhirnya, ada's built in cara untuk referensi default dari jenis apa pun. Ini kembali
null
untuk referensi jenis, tetapi untuk kami DateTime contoh itu akan kembali sama sepertiDateTime.MinValue
:Jika anda're menggunakan .NET 2.0 (atau yang lebih baru), anda dapat menggunakan nullable type:
atau
kemudian:
Dan anda dapat memeriksa nilai dengan:
Atau anda dapat menggunakannya seperti:
Anda dapat membaca lebih lanjut di sini: http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
DateTime? MyDateTime{get;set;}
Berikut cara bekerja dengan baik
Harap dicatat bahwa properti PublishDate harus DateTime?
I'd pertimbangkan untuk menggunakan nullable types.
DateTime? myDate
bukanDateTime myDate
.Anda dapat menggunakan nullable kelas.
Anda dapat menggunakan nullable DateTime untuk ini.
atau hal yang sama dituliskan seperti ini:
Hal ini perlu menunjukkan bahwa, sementara
DateTime
variabel tidak dapatnull
, itu masih dapat dibandingkan dengannull
tanpa compiler error:Saya selalu mengatur waktu untuk
DateTime.MinValue
. Cara ini aku tidak mendapatkan apapun NullErrorException dan saya dapat membandingkannya dengan tanggal yang aku tahu isn't set.Anda dapat mengatur DateTime untuk Nullable. Secara default DateTime tidak nullable. Anda dapat membuatnya nullable dalam beberapa cara. Menggunakan tanda tanya setelah tipe DateTime? myTime atau menggunakan generic gaya Nullable.
atau
Hanya berhati-hatilah Ketika menggunakan Nullable yang jelas tidak ada lagi 'murni' datetime objek, seperti anda tidak dapat mengakses DateTime anggota secara langsung. I'll mencoba menjelaskan.
Dengan menggunakan Nullable<> anda're pada dasarnya pembungkus DateTime dalam wadah (terima kasih generik) yang nullable - jelas tujuannya. Ini wadah yang memiliki sifat sendiri yang anda dapat menghubungi yang akan memberikan akses tersebut DateTime objek; setelah menggunakan properti yang benar - dalam hal ini Nullable.Nilai - maka anda memiliki akses ke standar DateTime anggota, sifat dll.
Jadi sekarang masalah ini datang ke pikiran sebagai cara terbaik untuk mengakses DateTime objek. Ada beberapa cara, nomor 1 adalah JAUH terbaik dan 2 adalah "bung mengapa".
DateTime date = myNullableObject.Nilai.ToUniversalTime(); //Bekerja
DateTime date = myNullableObject.ToUniversalTime(); //Tidak datetime objek, gagal
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //tapi mengapa...
Meskipun jawabannya adalah didokumentasikan dengan baik pada titik ini, saya percaya penggunaan Nullable adalah mungkin layak posting tentang. Maaf jika anda tidak setuju.
edit: Dihapus pilihan ketiga seperti itu agak terlalu spesifik dan tergantung kasus.
Meskipun semua orang telah memberikan anda jawabannya , saya'll menyebutkan cara yang membuatnya mudah untuk lulus datetime ke fungsi
[ERROR:tidak dapat mengubah sistem.datetime? untuk sistem.datetime]
Sekarang anda dapat melewati dte dalam fungsi tanpa masalah apapun.
Jika anda, kadang-kadang, mengharapkan null anda bisa menggunakan sesuatu seperti ini:
Dalam repositori anda menggunakan null-mampu datetime.
Aku punya masalah yang sama seperti yang saya punya untuk memberikan Null sebagai parameter untuk DateTime saat melakukan Unit test untuk Melempar ArgumentNullException.Bekerja dalam kasus saya menggunakan opsi berikut:
Mengingat sifat dari suatu data tanggal/waktu jenis ini tidak mengandung nilai "null", yaitu kebutuhan untuk memiliki sebuah nilai, tidak dapat kosong atau berisi apa-apa. Jika anda menandai tanggal/waktu variabel sebagai
nullable
maka hanya anda dapat menetapkan nilai null untuk itu. Jadi apa yang anda ingin lakukan adalah salah satu dari dua hal (mungkin masih ada lagi tapi aku hanya bisa memikirkan dua):Menetapkan minimum nilai tanggal/waktu untuk variabel anda jika anda don't memiliki nilai untuk itu. Anda dapat menetapkan maksimum nilai tanggal/waktu serta cara mana yang sesuai dengan anda. Hanya pastikan bahwa anda konsisten situs-lebar ketika memeriksa nilai-nilai tanggal. Memutuskan untuk menggunakan
min
ataumax
dan tetap dengan itu.Menandai tanggal/waktu variabel sebagai
nullable
. Dengan cara ini anda dapat mengatur tanggal/waktu variabel untuknull
jika anda don't memiliki variabel untuk itu.Biarkan saya menunjukkan titik pertama saya menggunakan contoh. The
DateTime
jenis variabel tidak dapat diatur untuk null, perlu nilai, dalam hal ini saya akan atur keDateTime
's nilai minimum jika tidak ada nilai.Skenario saya adalah bahwa saya memiliki
BlogPost
kelas. Ini memiliki berbagai bidang/properti tapi saya hanya memilih untuk menggunakan dua untuk contoh ini.DatePublished
adalah ketika posting ini diterbitkan ke situs web dan harus berisi nilai tanggal/waktu.DateModified
adalah ketika posting dimodifikasi, sehingga tidak't harus mengandung nilai, tetapi dapat berisi suatu nilai.Menggunakan
ADO.NET
untuk mendapatkan data dari database (menetapkanDateTime.MinValue
adalah tidak ada nilai):Anda dapat mencapai titik kedua saya dengan menandai
DateModified
lapangannullable
. Sekarang anda dapat mengaturnya untukkosong
jika tidak ada nilai untuk itu:Menggunakan
ADO.NET
untuk mendapatkan data dari database, maka akan terlihat sedikit berbeda dengan cara yang dilakukan di atas (menetapkannull
bukanDateTime.MinValue
):Saya berharap hal ini membantu untuk menjernihkan kebingungan. Mengingat bahwa tanggapan saya adalah sekitar 8 tahun kemudian anda mungkin seorang ahli C# programmer sekarang :)