2011-10-20 20 views
22

आम तौर पर, यदि मेरे पास वैकल्पिक पैरामीटर के लिए एक शून्य प्रकार है, तो मैं डिफ़ॉल्ट मान के रूप में शून्य डाल दूंगा। इस तरह से मुझे पता है कि यदि मान शून्य है, तो कॉलर उस के लिए कोई मान निर्दिष्ट नहीं करना चाहता है।डेटटाइम वैकल्पिक पैरामीटर में डिफ़ॉल्ट मान क्या होना चाहिए?

public void Foo(string text, string text2= null); 

तो पैरामीटर सामान्य रूप से एक सकारात्मक पूर्णांक है, मैं एक नकारात्मक संख्या

public void Foo(string text, int index=-1); 

कैसे दिनांक समय के बारे में उपयोग कर सकते हैं? यह शून्य नहीं है, और (जहां तक ​​मुझे पता है) इसमें एक अर्थहीन संख्या नहीं है जो एक वास्तविक इनपुट नहीं हो सकता है (जैसे सकारात्मक पूर्णांक के लिए -1)। या वहाँ है? आप इस स्थिति में क्या उपयोग करेंगे?

मुझे यह भी पता है कि मैं शून्य DateTime प्रकार का उपयोग कर सकता हूं, लेकिन इसका मतलब है कि विधि कॉलर को नाइटबल का उपयोग करना होगा और साथ ही आसानी से डेटटाइम को पास करने का विरोध करना होगा।

+0

संभावित डुप्लिकेट [सी # 4.0: क्या मैं एक डिफ़ॉल्ट मान के साथ एक वैकल्पिक पैरामीटर के रूप में टाइमस्पेन का उपयोग कर सकता हूं?] (Http://stackoverflow.com/questions/2168798/c-sharp-4-0-can-i- उपयोग-ए-टाइमपैन-ए----वैकल्पिक-पैरामीटर-साथ-एक-डिफ़ॉल्ट-मान) – nawfal

उत्तर

31

आप सी # में ? ऑपरेटर का उपयोग मूल्य प्रकार नल कर सकते हैं:

DateTime? myDate = null;

इस से, आप पैरामीटर वैकल्पिक बना सकते हैं:

void Foo(DateTime? myDate = null) 
{ 
} 

Further reading on Nullable Types.

यह वह जगह है हालांकि बिल्ली को त्वचा का एकमात्र तरीका नहीं है, आप default(DateTime) का उपयोग कर सकते हैं, हालांकि यो आप DateTime.MinValue, MaxValue, या Now वैकल्पिक पैरामीटर में उपयोग नहीं कर सकते क्योंकि वे समय स्थिरांक संकलित नहीं कर सकते हैं।

बेशक, आपको वैकल्पिक पैरामीटर का उपयोग करने की आवश्यकता नहीं है, यदि आप न्यूनतम, अधिकतम या अब उपयोग करना चाहते हैं तो आप अधिभारित विधियों का उपयोग कर सकते हैं।

void Foo() 
{ 
    Foo(DateTime.MinValue); 
} 

void Foo(DateTime d) 
{ 
} 

आप overkill (अच्छी तरह से, हो सकता है overkill नहीं, वैध कारण के बहुत सारे यह करने के लिए) जाने के लिए चाहते हैं, तो आप एक नई तिथि प्रकार है कि समझता है, जब यह एक मूल्य है निर्धारित कर सकते हैं:

class SmarterDateTime 
{ 
    public bool IsSet { get; set; } 

    // Wrapper around DateTime etc excluded. 
} 

डिफ़ॉल्ट के लिए क्या होना चाहिए, यदि आप चाहें तो किसी भी तारीख को डिफॉल्ट का प्रतिनिधित्व करना चुन सकते हैं, लेकिन वैकल्पिक पैरामीटर जैसी चीजों के लिए आपको सीमाएं मिलेंगी।

व्यक्तिगत रूप से, मैं DateTime.MinValue का उपयोग करता हूं।

+0

मुझे पता है, लेकिन यह थोड़ा अवांछनीय है, क्योंकि कॉलर कोड को इसे एक नाली के साथ कॉल करना होगा –

+1

@LouisRhys : जाहिर है कि वे नहीं करेंगे - 'डेटटाइम' से 'डेटटाइम' तक एक अंतर्निहित रूपांतरण है? –

+0

@ जोन्सकेट @डम वहां है? लेकिन फिर भी, मुझे याद है कि कभी-कभी मुझे ऐसी स्थितियों का सामना करना पड़ता है जहां मुझे उम्मीद है कि कोड 'डेटटाइम' के साथ काम करेगा, लेकिन 'डेटटाइम' के साथ काम नहीं करेगा? (सुनिश्चित नहीं है कि कोड क्या था, हालांकि) –

1
// This is the best way to null out the DateTime. 
    // 
    DateTime dateTime2 = DateTime.MinValue; 
+3

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

13

डिफ़ॉल्ट (DATETIME) - ऑपरेटर डिफ़ॉल्ट के लिए है यह

+1

इसका वास्तविक मूल्य क्या है? –

+2

किसी और के लिए सोचने के लिए, वास्तविक मूल्य यह है: '1-1-0001 0: 00: 00' – natli

+0

यह' डेटटाइम। मिनवैल्यू '(पहले वर्ष के पहले महीने के पहले दिन आधी रात) के बराबर है। – Kjartan

3

आप Nullable का उपयोग अपने कार्य की कॉल सिर्फ यह करने के लिए एक नियमित रूप से दिनांक समय पारित कर सकते हैं, तो वे एक बात नोटिस नहीं होगा:

public void Foo(DateTime? value = null) 
{ 
    if (value == null) 
    { 
     value = ... // default 
    } 
} 
4

जांच dateTime डिफ़ॉल्ट पैरामीटर, यह:) अंतर्निहित ऑपरेटरों उसके लिए आपको

आप अपने समारोह में एक डिफ़ॉल्ट आप कर सकते हैं सेट करना चाहते हैं यह कर देगा रहे हैं मूल्य 1/1/0001 12:00:00 AM होगा,

private void M(Int32 x = 9, String s = “A”, DateTimedt = default(DateTime), Guidguid = new Guid()) { 
Console.WriteLine(“x={0}, s={1}, dt={2}, guid={3}”, x, s, dt, guid); 
} 
1

आप मूल्य DateTime.MinValue और उपयोग से अधिक भार का उपयोग कर सोच सकते हैं।

6

प्रश्न पर "डेटटाइम के लिए डिफ़ॉल्ट मान क्या हो सकता है" प्रतिक्रिया होना चाहिए: आप केवल default(DateTime) का उपयोग कर सकते हैं। इसका कारण यह है डिफ़ॉल्ट मान const होना चाहिए और दोनों DateTime.MinValue और DateTime.MaxValue केवल static readonly हैं, लेकिन ध्यान दें कि

default(DateTime) == DateTime.MinValue 
Kind करने के लिए नीचे

यदि आप चाहते हैं कि आप एक कम पैरामीटर (DateTime) के साथ ओवरलोड को कार्यान्वित कर सकें और उस अधिभार से "मुख्य" विधि को आपके द्वारा पसंद किए जाने वाले मान को पारित कर दें।

लेकिन जैसा कि दूसरों द्वारा लिखा गया है, समस्या यह है कि आपने गलत परिसर लिखा था।

नहीं है, दिनांक समय (के रूप में लगभग सभी ValueType रों। लगभग सभी क्योंकि Nullable<Nullable<int>> अवैध है, यहाँ तक कि जब Nullable<T> एक ValueType है) नल है। Nullable<DateTime> या DateTime? (वही बात)

यहां तक ​​कि int शून्य हैं, आपको पता है? यह डिफ़ॉल्ट मान है करने के लिए int? :-)

2

कोड स्निपेट

public DateTime method1() 
{ 

    if (condition) 

    return new DateTime(2007, 5, 30, 11, 32, 00); 

    else 

    return default(DateTime); 

} 

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

सी # 2.0 फिर से उपयोग करते हैं, यह भी उपयोग करने के लिए निम्न उदाहरण में क्या एक नल प्रकार कहा जाता है, और वास्तव में वापसी शून्य, दिखाया गया है संभव है

कोड स्निपेट

public DateTime? method2() 
{ 

    if (condition) 

    return new DateTime(2007, 5, 30, 11, 32, 00); 

    else 

    return null; 

} 
+0

एमवीसी का उपयोग कर रहा है, मेरे पास डेटटाइम वैकल्पिक था, लेकिन जिस फ़ंक्शन को मैं कोशिश कर रहा था उसे डेटाटाइम में बदलने और बदलने के लिए कॉल नहीं किया जाएगा। जोड़ना फ़ंक्शन रिटर्न प्रकार को पूरी तरह से ठीक कर दिया .. धन्यवाद! –

5

DateTime.MinValue हो जाएगा डिफ़ॉल्ट मान

0

आपके उपयोग-मामले पर निर्भर करता है।

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

यदि आप न्यूनतम तारीख (बाद में सभी foo में रुचि रखते हैं) भेज रहे हैं तो सबसे पुरानी समझदार तिथि से पहले की तारीख होगी, और .Where(f -> f.When > myDate) जैसे कोड उस विशेष मामले को देखने के बिना भी काम करेंगे।

इसी प्रकार रिवर्स में अधिकतम तिथियों के साथ (किसी भी तारीख जो नवीनतम समझदार तिथि के बाद होगी)।

अन्यथा, केवल डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से उपयोग से बचें, और इसके बजाय ओवरलोड करें।

+0

"इसके बजाय अधिभार" से आपका मतलब है कि विधि विधियों को दोनों तरीकों से दोहराएं? –

+0

आदर्श रूप से जितना संभव हो उतना संभवतः एक को कॉल करके, या कोड के बड़े हिस्से के साथ एक निजी विधि को कॉल करके साझा किया जाएगा। जहां संतुलन झूठ है वहां पर निर्भर करता है कि आप कहानियों में क्या कर रहे हैं। –

+0

हां, मैं सहमत हूं, लेकिन अगर कोई अन्य कॉल करता है या दोनों एक ही विधि को कॉल करते हैं, तो हमें अभी भी मूल समस्या को हल करना होगा, है ना? –

संबंधित मुद्दे