यह देखने के लिए कि क्या डेटटाइम चर का कोई मान असाइन किया गया है


131

क्या यह देखने के लिए C # के भीतर एक आसान तरीका है कि यह देखने के लिए कि क्या DateTime उदाहरण को कोई मान दिया गया है या नहीं?

जवाबों:


83

एक वैरिएबल का एकमात्र तरीका जिसे C # में मान नहीं दिया गया है, उसके लिए एक स्थानीय वैरिएबल होना जरूरी है - जिस स्थिति में संकलन-समय पर आप यह बता सकते हैं कि निश्चित रूप से इसे पढ़ने की कोशिश करके असाइन नहीं किया गया है: )

मुझे संदेह है कि आप वास्तव में चाहते हैं Nullable<DateTime>(या DateTime?सी # सिंटैक्टिक शुगर के साथ) - इसे nullशुरू करने के लिए बनाएं और फिर एक सामान्य DateTimeमूल्य (जिसे उचित रूप से परिवर्तित किया जाएगा) असाइन करें । तब आप केवल यह देखने के लिए कि क्या "वास्तविक" मूल्य निर्धारित किया गया है, उसके साथ तुलना null(या HasValueसंपत्ति का उपयोग ) कर सकते हैं।


कैसे के बारे में जाँच अगर मूल्य डिफ़ॉल्ट डेटाइम मूल्य के बराबर है। क्या इस दृष्टिकोण से किसी का ध्यान नहीं है? if (request.StartDateTime == default (DateTime) {request.StartDateTime = DateTime.Now;}
मेनोल

8
@ मेनोल: वैसे यह एक ऐसे क्षेत्र के बीच का अंतर नहीं बताता है, जिसे जानबूझकर एक मूल्य दिया गया है default(DateTime)और एक जो सिर्फ उस तरीके से शुरू करना था। मूल रूप से यह डोमेन के भीतर एक मूल्य को "सामान्य उपयोग के लिए विशेष और अनुपलब्ध" के रूप में मान रहा है, जिसे मैं नापसंद करता हूं।
जॉन स्कीट

298

क्या आपका मतलब ऐसा है:

DateTime datetime = new DateTime();

if (datetime == DateTime.MinValue)
{
    //unassigned
}

या आप Nullable का उपयोग कर सकते हैं

DateTime? datetime = null;

 if (!datetime.HasValue)
 {
     //unassigned
 }

5
इनमें से केवल दूसरा ही बुलेट प्रूफ है। पहली बार किसी दिनांक समय की अनिश्चित प्रतिनिधित्व के बारे में कुछ मानता है जो फ्रेमवर्क द्वारा गारंटी नहीं है। व्यक्तिगत रूप से मुझे लगता है कि उन्हें इस परिदृश्य के लिए एक Unset स्थिर सदस्य जोड़ना चाहिए था।
रूपर्ट रॉन्सले

18
@RupertRawnsley ने जो कहा, उस पर जोड़ने के लिए, आपको वास्तव में डिफ़ॉल्ट (डेटटाइम) के साथ तुलना करनी चाहिए, जो एक अनसाइनड डेटटाइम का मूल्य है। यह सिर्फ इतना होता है कि MinValue के बराबर होता है, लेकिन यह बदल सकता है।
त्सही अशर

32

इसे कहीं रखो:

public static class DateTimeUtil //or whatever name
{
    public static bool IsEmpty(this DateTime dateTime)
    {
        return dateTime == default(DateTime);
    }
}

फिर:

DateTime datetime = ...;

if (datetime.IsEmpty())
{
    //unassigned
}

मुझे यह विचार पसंद है, लेकिन ध्यान दें कि कुछ समय की संभावना नहीं है कि DateTime चर को एक मान सौंपा गया है जो डिफ़ॉल्ट मान होता है, यह एक्सटेंशन विधि गलत परिणाम लौटाएगा। इससे बचने का एकमात्र तरीका एक अशक्त डेटाइम का उपयोग करना है, जो पहले ही सुझाया जा चुका है। मैं अभी भी वास्तव में पसंद करता हूं (और अब उपयोग कर रहा हूं) हालांकि आपका जवाब, धन्यवाद!
19

@ कालीकर: आपकी अच्छी टिप्पणी के लिए धन्यवाद, लेकिन मुझे यकीन नहीं है कि मैं आपकी टिप्पणी को समझ सकता हूं। जहां तक ​​मैं बता सकता हूं == इस मामले में हमेशा सच वापस आएगा जब डेटाइम डिफ़ॉल्ट (डेटाइम) के बराबर होता है, जिस तरह से डेटाइम एंड-अप को डिफ़ॉल्ट मान सौंपा जा रहा है। मुझे समझाने दें: वास्तव में मेरे जवाब में दूसरा स्निपेट गलत है, यह संकलन नहीं करेगा, क्योंकि, यदि आप मानते हैं कि यह एक फ़ंक्शन का निकाय है, तो डेटाटाइम अस्वाभाविक है, और कंपाइलर इसका उपयोग करने से इनकार करेगा। इसलिए आपको इसे एक मूल्य प्रदान करना होगा। यह प्रत्यक्ष या अप्रत्यक्ष रूप से डिफ़ॉल्ट (DateTime) हो सकता है। मैं अपना उत्तर संशोधित करूंगा।
22

और यदि किसी अन्य संदर्भ में डेटाइम एक वर्ग का सदस्य है, और यह जैसा है उसे छोड़ दिया जाता है, रनटाइम इसे डिफ़ॉल्ट (DateTime) असाइन करेगा। == संरचनाओं के लिए वास्तव में संरचना की सामग्री की तुलना करते हैं, जिस तरह से इस सामग्री से भरा संरचना अंत है।
सोनाटिक्स

मेरी बात केवल कक्षा के सदस्यों से ही संबंधित है, और मेरा मतलब है; यदि आपके पास एक क्लास लेवल DateTime फ़ील्ड या प्रॉपर्टी है जिसे आपने MinValue को सौंपा है, तो आपका IsEmptyतरीका सही हो जाएगा, जो कि शायद आप क्या चाहते हैं (क्योंकि यह खाली नहीं है - इसे डिफ़ॉल्ट मान सौंपा गया है)। मुझे लगता है कि आपकी विधि का नाम अधिक अनुकूल होगा IsDefaultValue। चूँकि आपके पास वास्तव में एक गैर-अशक्त DateTime नहीं हो सकता है IsEmpty
क्लिष्ट

@ काली: आह हाँ, ठीक है, समझ गया। आप सही हैं: मैंने जो नाम चुना है वह भ्रामक है। IsDefaultValueबेहतर होता
सोनाटिक्स

5

डेटटाइम मान प्रकार है, इसलिए इसे कभी भी अशक्त नहीं किया जा सकता है। अगर आपको लगता है कि DateTime? (अशक्त) आप उपयोग कर सकते हैं:

DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;

5

मुझे अभी पता चला है कि एक अनचाही डेटाइम के लिए गेटहैशकोड () हमेशा शून्य होता है। मुझे यकीन नहीं है कि यह शून्य डेटाइम के लिए जांचने का एक अच्छा तरीका है, क्योंकि, मुझे इस बात का कोई दस्तावेज नहीं मिल रहा है कि यह व्यवहार क्यों प्रदर्शित किया गया है।

if(dt.GetHashCode()==0)
{
    Console.WriteLine("DateTime is unassigned"); 
} 

1
GetHashCodeटिक्स के कारण रिटर्न 0 (डेटाइम का आंतरिक प्रतिनिधित्व) भी 0. हाश कोड के बराबर है जो निम्न तरीके से गणना की जाती है unchecked((int)ticks) ^ (int)(ticks >> 32);:। इसके अलावा यहाँ देखें: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
इवान Kochurkin

आपका बहुत बहुत धन्यवाद। मैं एक XML फ़ाइल को C # वर्ग से अनुक्रमित करने और अशक्त विशेषताओं को बाहर करने की कोशिश कर रहा हूं। इससे मदद मिली।
जिम नेफ


3

मैं कहूंगा कि डिफ़ॉल्ट मान हमेशा होता है new DateTime()। तो हम लिख सकते हैं

DateTime datetime;

if (datetime == new DateTime())
{
    //unassigned
}

2
यह समाधान 2008 में + हाथ द्वारा पहले ही दे दिया गया था और जैसा कि + रूपर्ट रॉन्सले ने टिप्पणी के रूप में जोड़ा, बुलेट-प्रूफ नहीं है ...
रोलैंड बीआरई

0

मैं आम तौर पर पसंद करता हूं, जहां संभव हो, यह निर्धारित करने के लिए कि वे सेट किए गए हैं, मान के डिफ़ॉल्ट मान का उपयोग करें। यह स्पष्ट रूप से हर समय संभव नहीं है, विशेष रूप से ints के साथ - लेकिन डेटटाइम्स के लिए, मुझे लगता है कि MinValue को जलाकर यह संकेत देना कि इसे नहीं बदला गया है, काफी उचित है। Nullables पर इस लाभ का यह है कि एक कम जगह है जहाँ आपको एक शून्य संदर्भ अपवाद मिलेगा (और शायद बहुत से स्थान जहाँ आपको इसे एक्सेस करने से पहले नल के लिए जाँच नहीं करनी है!)


0

यदि आप अशक्त मूल्य के मुद्दों के बारे में चिंता नहीं करना चाहते हैं जैसे कि हर बार जब आप इसका उपयोग करते हैं या इसे कुछ लॉजिक में लपेटते हैं, तो आप इसे खाली समय के मुद्दों के बारे में चिंता नहीं करना चाहते हैं, तो यह मैंने समस्या हल कैसे की:

startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt

मैं सिर्फ यह देखता हूं कि डिफ़ॉल्ट मूल्य समय की शुरुआत के बाद एक दिन से भी कम है। एक जादू की तरह काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.