जवाबों:
एक वैरिएबल का एकमात्र तरीका जिसे C # में मान नहीं दिया गया है, उसके लिए एक स्थानीय वैरिएबल होना जरूरी है - जिस स्थिति में संकलन-समय पर आप यह बता सकते हैं कि निश्चित रूप से इसे पढ़ने की कोशिश करके असाइन नहीं किया गया है: )
मुझे संदेह है कि आप वास्तव में चाहते हैं Nullable<DateTime>
(या DateTime?
सी # सिंटैक्टिक शुगर के साथ) - इसे null
शुरू करने के लिए बनाएं और फिर एक सामान्य DateTime
मूल्य (जिसे उचित रूप से परिवर्तित किया जाएगा) असाइन करें । तब आप केवल यह देखने के लिए कि क्या "वास्तविक" मूल्य निर्धारित किया गया है, उसके साथ तुलना null
(या HasValue
संपत्ति का उपयोग ) कर सकते हैं।
default(DateTime)
और एक जो सिर्फ उस तरीके से शुरू करना था। मूल रूप से यह डोमेन के भीतर एक मूल्य को "सामान्य उपयोग के लिए विशेष और अनुपलब्ध" के रूप में मान रहा है, जिसे मैं नापसंद करता हूं।
क्या आपका मतलब ऐसा है:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
या आप Nullable का उपयोग कर सकते हैं
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
इसे कहीं रखो:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
फिर:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
IsEmpty
तरीका सही हो जाएगा, जो कि शायद आप क्या चाहते हैं (क्योंकि यह खाली नहीं है - इसे डिफ़ॉल्ट मान सौंपा गया है)। मुझे लगता है कि आपकी विधि का नाम अधिक अनुकूल होगा IsDefaultValue
। चूँकि आपके पास वास्तव में एक गैर-अशक्त DateTime नहीं हो सकता है IsEmpty
।
IsDefaultValue
बेहतर होता
मुझे अभी पता चला है कि एक अनचाही डेटाइम के लिए गेटहैशकोड () हमेशा शून्य होता है। मुझे यकीन नहीं है कि यह शून्य डेटाइम के लिए जांचने का एक अच्छा तरीका है, क्योंकि, मुझे इस बात का कोई दस्तावेज नहीं मिल रहा है कि यह व्यवहार क्यों प्रदर्शित किया गया है।
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCode
टिक्स के कारण रिटर्न 0 (डेटाइम का आंतरिक प्रतिनिधित्व) भी 0. हाश कोड के बराबर है जो निम्न तरीके से गणना की जाती है unchecked((int)ticks) ^ (int)(ticks >> 32);
:। इसके अलावा यहाँ देखें: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
मैं कहूंगा कि डिफ़ॉल्ट मान हमेशा होता है new DateTime()
। तो हम लिख सकते हैं
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
मैं आम तौर पर पसंद करता हूं, जहां संभव हो, यह निर्धारित करने के लिए कि वे सेट किए गए हैं, मान के डिफ़ॉल्ट मान का उपयोग करें। यह स्पष्ट रूप से हर समय संभव नहीं है, विशेष रूप से ints के साथ - लेकिन डेटटाइम्स के लिए, मुझे लगता है कि MinValue को जलाकर यह संकेत देना कि इसे नहीं बदला गया है, काफी उचित है। Nullables पर इस लाभ का यह है कि एक कम जगह है जहाँ आपको एक शून्य संदर्भ अपवाद मिलेगा (और शायद बहुत से स्थान जहाँ आपको इसे एक्सेस करने से पहले नल के लिए जाँच नहीं करनी है!)
यदि आप अशक्त मूल्य के मुद्दों के बारे में चिंता नहीं करना चाहते हैं जैसे कि हर बार जब आप इसका उपयोग करते हैं या इसे कुछ लॉजिक में लपेटते हैं, तो आप इसे खाली समय के मुद्दों के बारे में चिंता नहीं करना चाहते हैं, तो यह मैंने समस्या हल कैसे की:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
मैं सिर्फ यह देखता हूं कि डिफ़ॉल्ट मूल्य समय की शुरुआत के बाद एक दिन से भी कम है। एक जादू की तरह काम करता है।