2012-01-24 8 views
17

में वैकल्पिक पैरामीटर के रूप में उपयोग नहीं किया जा सकता है, मैं एक विधि लिख रहा था जो DateTime मान को इसके पैरामीटर के रूप में लेता है। मैंने फैसला किया कि यह वैकल्पिक पैरामीटर है इसलिए मैं आगे बढ़ गया और डिफ़ॉल्ट रूप से DateTime.MinValue बनाने की कोशिश की। 'TestVar' के लिएक्यों DateTime.MinValue को C#

डिफ़ॉल्ट पैरामीटर मान एक संकलन समय निरंतर होना चाहिए:

private void test(string something, DateTime testVar = DateTime.MinValue) { 

} 

हालांकि यह एक त्रुटि है कि देता है।

इस कोड का उपयोग करना ठीक काम करता है।

private void test(string something, DateTime testVar = new DateTime()) { 

} 

मुझे DateTime.MinValue instead of new DateTime() का उपयोग करने के लिए सलाह दी गई थी क्योंकि यह स्वयं-दस्तावेज़ है। चूंकि new DateTime() मूल रूप से वही बात है जो DateTime.MinValue का उपयोग नहीं किया जा सकता है? अगर मैं new DateTime() के साथ छोड़ देता हूं तो क्या कोई संभावित समस्या होगी?

public static readonly DateTime MinValue 

कौन सा const के समान नहीं है: के रूप में

+1

वैकल्पिक दृष्टिकोण: डिफ़ॉल्ट मान के लिए डेटटाइम होने पर यह कब समझता है। MinValue? मुझे एहसास है कि यह डेटटाइम के लिए * डिफ़ॉल्ट * है, लेकिन क्या यह वास्तव में दी गई विधि के लिए उपयुक्त मूल्य है? या हो सकता है कि यदि मूल्य प्रदान नहीं किया गया है, तो क्या यह केवल शून्य नहीं होना चाहिए? –

+0

मैं एसक्यूएल से मूल्य प्राप्त करते समय 'DateTime.MinValue' का उपयोग कर रहा हूं जो 'डेटटाइम' के रूप में शून्य था, शून्य नहीं है। 'डेटटाइम?' है। – MadBoy

+2

वह बिंदु है जो मैं वास्तव में प्राप्त कर रहा हूं, और यह यहां अधिक लागू है। यदि आप किसी ऐसे डेटाबेस में मैपिंग कर रहे हैं जो निरर्थक तिथियों का समर्थन करता है, तो यह आपके कोड में निरर्थक तिथियों का उपयोग करने के लिए उचित लगता है, और उसके बाद तिथियों के लिए कोई मूल्य नहीं है, क्योंकि वे आपके डेटाबेस में हैं। केवल एक विचार। –

उत्तर

11

DateTime.MinValue परिभाषित किया गया है। चूंकि readonly मान संकलन-समय स्थिर नहीं है (यानी मान संकलन-समय पर मूल्यांकन नहीं किया गया है), इसका उपयोग नहीं किया जा सकता है।

new DateTime() का उपयोग करने का कारण यह है कि अभिव्यक्ति संकलन-समय पर ज्ञात है। यह default(DateTime) लिखने जैसा ही है। उदाहरण के लिए, result == true निम्नलिखित अभिव्यक्ति में के लिए:

var result = new DateTime() == default(DateTime); 
+0

नया डेटटाइम()? – MadBoy

+0

@MadBoy मेरे संपादनों को देखें जो इस प्रश्न को संबोधित करते हैं। – Yuck

5

DateTime.MinValue readonly है और MSDN के अनुसार, केवल पढ़ने के लिए मूल्यों संकलन समय नहीं कर रहे हैं स्थिरांक:

केवल पढ़ने के लिए कीवर्ड स्थिरांक से अलग है कीवर्ड। एक कॉन्स फील्ड केवल क्षेत्र की घोषणा में शुरू किया जा सकता है। एक पठनीय क्षेत्र या तो घोषणा या एक निर्माता में शुरू किया जा सकता है। इसलिए, इस्तेमाल किए गए कन्स्ट्रक्टर के आधार पर केवल पढ़ने वाले फ़ील्ड में अलग-अलग मान हो सकते हैं। इसके अलावा, जबकि एक स्थिरांक क्षेत्र एक संकलन समय स्थिर है, केवल पढ़ने के लिए क्षेत्र क्रम के लिए इस्तेमाल किया जा सकता स्थिरांक

+0

'नया डेटटाइम 'के बारे में क्या? यह क्यों काम करता है? क्या मैं इसे' नई डेटटाइम 'पर छोड़ सकता हूं या क्या मुझे शून्य और शून्य 'डेटटाइम' का उपयोग करना चाहिए? – MadBoy

+0

मुझे निश्चित रूप से लगता है कि आपको डेटटाइम – Magnus

+0

@ मैग्नस के नलबल के साथ जाना चाहिए, शायद मैं डेटटाइम के नलबल के साथ जाऊंगा लेकिन मैं पूरे विषय पर स्पष्टीकरण प्राप्त करना चाहता हूं ताकि यह समाप्त हो जाए मेरा सिर ई बहुत ही डेटटाइम पर ध्यान केंद्रित करने लगते हैं। मिनवैल्यू जो ठीक है लेकिन सवाल का दूसरा हिस्सा है;) – MadBoy

1

क्या मैं दिनांक समय के लिए डिफ़ॉल्ट मूल्य के बारे में पता कर रहा हूँ के आधार पर DateTime.MinValue तो क्यों सिर्फ नए दिनांक समय का उपयोग नहीं है()

+0

यह काम नहीं करेगा। डिफ़ॉल्ट मान संकलन-समय स्थिरांक होना चाहिए। 'नया डेटटाइम()' निश्चित रूप से एक संकलन-समय स्थिर नहीं है। –

+1

@ जिम मिशेल मेरे प्रश्न के अनुसार यह वास्तव में ठीक है कि अगर मैं नई डेटटाइम() का उपयोग करता हूं तो यह ठीक से संकलित करने की अनुमति देता है .. इसलिए मैं सोच रहा हूं/चिंता कर रहा हूं कि यह मुझे किसी बिंदु पर वापस शूट करेगा। – MadBoy

+0

मैं समझता हूं कि उन्होंने जो कहा है उसके आधार पर मैं केवल यह मान रहा हूं कि वह शायद डेटटाइम का एक चर घोषित कर सकता है कुछ दिनांक समय = नया दिनांक समय(); यह उनके प्रश्न की मेरी समझ थी और मुझे पता है कि यह संकलित होगा ... – MethodMan

4

DateTime.MinValue (और DateTime.MaxValue) संकलन-समय स्थिरांक के बजाय public static readonly सदस्य हैं।

अपने डिफ़ॉल्ट के रूप में DateTime.MinValue का उपयोग करने के बजाय, एक शून्य दिनांक दिनांक (DateTime?) का उपयोग क्यों न करें। यह आपके इरादे को डेटाटाइम के सबसे कम संभव मूल्य पर डिफॉल्ट करने से अधिक स्पष्ट बनाता है।

कुछ इस तरह:

private void test(string something, DateTime? testVar = null) 
{ 
    if (testVar.HasValue) 
    { 
    DoSomethingUsefulWithTimestamp(something , testVar.Value) ; 
    } 
    else 
    { 
    DoSomethingElseWithoutTimestamp(something) ; 
    } 
    return ; 
} 

private void DoSomethingUsefulWithTimestamp(string something , DateTime dt) 
{ 
    ... // something useful 
} 
private void DoSomethingElseWithoutTimestamp(string something) 
{ 
    ... // something useful 
} 

वैकल्पिक रूप से, अपने विधि शरीर में अपने डिफ़ॉल्ट सेट:

private void test(string something, DateTime? testVar = null) 
{ 
    DateTime dtParameter = testVar ?? DateTime.MinValue ; 

    DoSomethingUsefulWithTimestamp(something , dtParameter) ; 

} 
+0

समस्या यह है कि मेरे पास डेटटाइम है। सभी कोड में MinValue और मैं निरर्थक डेटटाइम का उपयोग नहीं करता? बिलकुल। कोड भर में संगत होने के लिए इसे ठीक करना एक हत्यारा होगा। मैं निश्चित रूप से इस बार एक चीज के लिए कर सकता हूं लेकिन मैं डेटटाइम पास कर सकता हूं। कुछ बिंदु पर दुर्घटना से मिनवैल्यू, इसलिए यह संभव है कि अगर मुझे डेटटाइम.माइनवैल्यू दोनों के लिए चेक में चेक के रूप में कोड में इसका ध्यान रखना होगा या गलतियों को न करने के लिए गिनती :) – MadBoy

3

एक अन्य विकल्प 2 विधि भार के संबंध के लिए होगा:

  • एक यह है कि डेटटाइम पैरामीटर
  • एक वें लेता है दिनांक दिनांक पैरामीटर

इसका लाभ यह है कि आपको यह जांचना नहीं होगा कि पैरामीटर शून्य है या नहीं, और यह स्पष्ट होगा कि आपका इरादा क्या है। आंतरिक रूप से, विधि 1 डेटाबेस में एक शून्य जोड़ सकता है।

9

अन्य उत्तर इस बात पर स्पर्श करते हैं कि DateTime.MinValue का उपयोग क्यों नहीं किया जा सकता है, यह कानूनी संकलन समय स्थिर नहीं है। यह static readonly फ़ील्ड है, जो उपयोग के रूप में बहुत अच्छी तरह से स्थिर हो सकता है, लेकिन कानूनी रूप से स्थिर नहीं है, और न ही यह डिफ़ॉल्ट तर्क के रूप में उपयोग किए जा सकने वाले नियमों के अनुरूप नियमों को फिट करता है। क्यों new DateTime() का उपयोग किया जा सकता है, C# 4.0 Language Specification के अनुभाग 10.6.1 देखें। प्रासंगिक बिट:

एक डिफ़ॉल्ट तर्क में अभिव्यक्ति निम्न में से एक होना चाहिए:

· एक निरंतर अभिव्यक्ति

· प्रपत्र नई एस की अभिव्यक्ति() जहां एस है एक मान प्रकार

· प्रपत्र डिफ़ॉल्ट (एस) की अभिव्यक्ति जहां एस एक मान प्रकार

है

ये परिणाम शून्य-प्रारंभिक उदाहरण में हैं, मूल रूप से सभी शून्यों का थोड़ा सा पैटर्न। (देखें: धारा 4.1.2)

हालांकि, इस मामले में, मैं अभी भी पैरामीटर और डिफ़ॉल्ट तर्क के रूप में DateTime? value = null का उपयोग करने की सलाह देता हूं, खासकर जब यह डेटाबेस में एक शून्य तिथि का प्रतिनिधित्व करता है। MinValue एक मूल्य की अनुपस्थिति नहीं है। null है।

+0

स्पष्ट जानकारी के लिए धन्यवाद। काश है कि 2 उत्तरों (सहायक उत्तर की तरह) स्वीकार करने का विकल्प था। – MadBoy

0

इस बयान

private void test(string something, DateTime testVar = new DateTime()) { 
    if (testVar != new DateTime()) 
    { 
     DoSomethingUsefulWithTimestamp(something , testVar.Value) ; 
    } 
    else 
    { 
     DoSomethingElseWithoutTimestamp(something) ; 
    } 
} 

उपयोग यह ज्यादा बेहतर काम करना चाहिए। यह एक बमर है कि शून्य काम नहीं करता है, क्योंकि इससे अधिक समझदारी होगी।