2011-04-04 19 views
11

मैं कहता हूँ करना चाहते हैं:मैं डेटटाइम पर पैरामीटर कैसे डिफ़ॉल्ट करूं। MaxValue सी # में?

public void Problem(DateTime optional = DateTime.MaxValue) 
{ 
} 

लेकिन संकलक शिकायत है कि DateTime.MaxValue एक संकलन समय स्थिर नहीं है।

DateTime.MinValue आसान है, बस डिफ़ॉल्ट (DATETIME) का उपयोग

भी देख "How do I default a parameter to Guid.Empty in C#?"

मैं विधि से अधिक भार का उपयोग नहीं करना चाहते हैं, विधि के रूप में मैं वश में करने के कोशिश कर रहा हूँ 101 पैरामीटर है!

+2

@ सैम होल्डर लेकिन 8.5k के साथ एक ओपी कैसे अपने तरीके से 101 पैरामीटर के साथ समाप्त हुआ? मैंने कभी ऐसा नहीं किया है। मैं वास्तव में जानना चाहता हूं कि यह सबसे अच्छा डिज़ाइन क्यों प्रतीत होता है। वहाँ युग्मन का एक पागल स्तर प्रतीत होता है। सहजता से मुझे आश्चर्य होगा अगर आपको इस तरह की विधि के लिए अच्छा 'कोड मेट्रिक्स' मिलता है। –

+0

@ सैम होल्डर जेरी सेनफेल्ड को उद्धृत करने के लिए: "यदि आपके पास रक्त के दागों के साथ टी-शर्ट मिला है तो शायद कपड़े धोने की आपकी सबसे बड़ी समस्या नहीं है"। डेटटाइम समस्या पैरामीटर समस्या के परिधीय प्रतीत होती है। –

+2

@ सिमेन अच्छी तरह से, 101 पैरामीटर कई तरीकों से हो सकते हैं। विरासती तंत्र; रिफैक्टर (इस प्रकार तकनीकी ऋण लेने) के समय की कमी के कारण डेवलपर्स की टीम व्यवहार का विस्तार करती है; और निश्चित रूप से, इस मामले के रूप में, भारी कटाक्ष है। इसके अलावा आपको क्या लगता है कि 101 पैरामीटर उसके कर रहे हैं? –

उत्तर

9

मैं की तरह कुछ के लिए यह विकल्प होगा:

public void Problem(DateTime? optional = null) 
{ 
    DateTime dateTime = optional != null ? optional.Value : DateTime.MaxValue; 
    // Now use dateTime 
} 
+1

यह कम से कम खराब विकल्प दिखता है, क्योंकि मैं कोड बेस को फिर से लिख नहीं सकता हूं। –

+7

@IanRingrose आप इसे [नल-कोलेसिंग ऑपरेटर] (http://msdn.microsoft.com/en-us/library/ms173224.aspx) का उपयोग करके भी लिखना चाहेंगे, यह है: 'दिनांक समय दिनांक समय = वैकल्पिक ?? डेटटाइम। मैक्सवेल्यू; ' –

3

आप एक से अधिक कार्यों को परिभाषित कर सकते हैं:

public void Problem() 
{ 
    Problem(DateTime.MaxValue); 
} 
public void Problem(DateTime optional) 
{ 
    // do your stuff here. 
} 

आप समस्या() (पैरामीटर के बिना) को कॉल करते हैं कि समारोह एक पैरामीटर के साथ अन्य समारोह कहता है।

+0

यह संभावित रूप से भ्रमित है। दोनों विधियां एक ही हस्ताक्षर रखने के लिए पहली नज़र में दिखाई देती हैं। सी # spec [हमें बताता है] (http://stackoverflow.com/questions/2674417/c-4-conflicting-overloaded-methods-with-optional-parameters) कि संकलक * वैकल्पिक पैरामीटर के बिना विधि * पसंद करेंगे, लेकिन आपको उस व्यवहार की उम्मीद करने वाले हर किसी पर भरोसा नहीं करना चाहिए। अन्य सुझाए गए समाधान बहुत स्पष्ट और अधिक रखरखाव योग्य हैं। –

1

loadDefault पैरामीटर मान, कि है, स्थिरांक हैं यह string.Empty/Guid.Empty नहीं किया जा सकता और आदि आप एक विधि अधिभार का उपयोग कर सकते हैं:

void M(int intValue) 
{ 
    M(intValue, Guid.Empty); 
} 
void M(int intValue, Guid guid) 
{ 
    //do something 
} 
3

मैं सी # 4.0 से परिचित नहीं हूँ, लेकिन में सी # 3.5 मैं अधिभार का उपयोग करना होगा;

public void Problem() 
{ 
    Problem(DateTime.MaxValue); 
} 
public void Problem(DateTime dt) 
{ 
} 

और से कॉल करने या तो:

Problem(); //defaults to maxvalue 
Problem(myDateTime); //uses input value 

संपादित करें: बस कुछ टिप्पणियों का उत्तर डाल करने के लिए;

public class FooBar 
{ 
    public bool Problem() 
    { 
     //creates a default person object 
     return Problem(new Person()); 
    } 

    public void Problem(Person person) 
    { 
     //Some logic here 
     return true; 
    } 
} 

public class Person 
{ 
    public string Name { get; private set; } 
    public DateTime DOB { get; private set; } 
    public Person(string name, DateTime dob) 
    { 
     this.Name = name; 
     this.DOB = dob; 
    } 

    /// <summary> 
    /// Default constructor 
    /// </summary> 
    public Person() 
    { 
     Name = "Michael"; 
     DOB = DateTime.Parse("1980-07-21"); 
    } 
} 
+3

यदि केवल विधि जिसकी मैं कोशिश कर रहा हूं, उसके पास 101 पैरामीटर नहीं हैं .. –

+3

@Ian: हाहाहा, ओमग !! मुझे लगता है कि आपके पास एक पूरी तरह से अलग समस्या है! पैरामीटर वर्ग का प्रयोग करें। 101 पैरामीटर ...! –

+0

@ इयान रिंगरोस आपके पास किसी दिए गए विधि या कन्स्ट्रक्टर में 5 से अधिक (?) पैरामीटर नहीं होना चाहिए। जैसा कि @ डैनियल ने सुझाव दिया है, इन मानकों को एक समस्याएं कक्षा में वर्गीकृत करें और इसके बजाय इसे पास करें। – firefox1986

2

सरल उत्तर यह है कि आप वैकल्पिक पैरामीटर के साथ नहीं कर सकते हैं जो मुझे नहीं लगता है।

यदि आप एकमात्र पैरामीटर हैं तो आप ओवरलोड का उपयोग कर सकते हैं। यदि यह कई वैकल्पिक पैरा के साथ एक विधि के लिए एक उदाहरण है, तो यह संभव नहीं हो सकता है।

आप क्या कर सकता है यह DateTime? और null गुजरती हैं, तो अपने विधि में DateTime.MaxValue रूप null व्याख्या करते हैं।

वैकल्पिक तर्कों का एक अच्छा लेखन है जो मैं आपके लिए खोदूँगा।

संपादित

article here

+0

-1: आपका सुझाव बहुत खराब है, क्योंकि नल को आम तौर पर 'डिफ़ॉल्ट (टी)' के समकक्ष के रूप में देखा जाता है। आप अपने दृष्टिकोण के साथ अर्थशास्त्र को बहुत भारी बदल देंगे। एक अधिभार का उपयोग करने का सही तरीका होगा। –

+1

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

+0

विधि में कई पैरामीटर होने पर एक अधिभार संभव नहीं हो सकता है और ओपी सिर्फ प्रश्न के लिए एक उदाहरण दे रहा है। यदि यह एकमात्र परम है तो हाँ एक अधिभार बेहतर है। मैं केवल वैकल्पिक विकल्प का सुझाव देना चाहता था, क्योंकि वह वैकल्पिक पैरामीटर का उपयोग करना चाहता है, क्योंकि मुझे नहीं लगता कि वह अपना वांछित व्यवहार किसी अन्य तरीके से प्राप्त कर सकता है और अभी भी इसे एक वैकल्पिक पैरामीटर के रूप में प्राप्त कर सकता है। –

2

हैं, के रूप में आप अपनी टिप्पणी में से एक में कहा गया है, अपने विधि मानकों का एक बहुत है, आप उन्हें सभी को पैरामीटर वर्ग में बदल सकते हैं और इसकी संपत्ति प्रारंभकर्ताओं का उपयोग कर सकते हैं। फिर आपको सभी गुणों को प्रारंभ करने की आवश्यकता नहीं होगी, और आप उस श्रेणी के निर्माता में दिनांक DateTime.MaxValue पर सेट कर सकते हैं।

3

आप जो करना चाहते हैं वह बस संभव नहीं है। DateTime.MaxValue संकलन-समय स्थिर नहीं है; यह वास्तव में केवल पढ़ने योग्य फ़ील्ड है जिसे एक स्थिर कन्स्ट्रक्टर द्वारा रनटाइम पर प्रारंभ किया जाता है।वह difference यहां काफी महत्वपूर्ण हो गया है। वैकल्पिक पैरामीटर को संकलन-समय स्थिरांक की आवश्यकता होती है, क्योंकि वे सीधे कोड में मूल्य को सेंकते हैं।

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

5

आपकी टिप्पणियों में से एक के अनुसार, आप पैरामीटर के साथ एक विधि बनाने की कोशिश कर रहे हैं जो कॉलर्स के लिए अधिक उपयोग योग्य हैं।
मैं दृढ़ता से सुझाव देता हूं कि आप पैरामीटर क्लास बनाते हैं और डिफ़ॉल्ट मान के साथ उस वर्ग के गुणों को प्रारंभ करते हैं। अपनी विधि के लिए एक अधिभार प्रदान करें जो केवल एक पैरामीटर स्वीकार करता है: पैरामीटर वर्ग।
यह वास्तव में आपकी विधि के उपयोग में सुधार करेगा, क्योंकि उपयोगकर्ता अपने पैरामीटर क्लास इंस्टेंस का पुन: उपयोग भी कर सकता है अगर उसे केवल एक पैरामीटर बदलना है।

+0

मैं _multiple_ पैरामीटर कक्षाओं के साथ और सोच रहा था। यह अजीब होगा अगर इनमें से कुछ पैरामीटर "समूहों में एक साथ नहीं" थे। –

+0

@ सिमेन: अपना कोड जानने के बिना, हम नहीं जानते, लेकिन यदि वे समूह में हैं, तो आपका सुझाव समझ में आता है। –

+0

मुझे लगता है कि ऐसे परिदृश्य हो सकते हैं जहां एक एकल वर्ग बहुत से परमाणु सूचना तत्वों से निपट रहा है जो बहुत असंबंधित हैं: उदा। यदि आप एक कमजोर टाइप की गई कॉन्फ़िगरेशन फ़ाइल और आपके एप्लिकेशन के मूल के बीच दृढ़ता से टाइप किए गए इंटरफ़ेस को परिभाषित करने का प्रयास कर रहे हैं। फिर भी, मेरा मानना ​​है कि उन्हें एक विधि विधि के माध्यम से सभी को पारित करने से बचा जाना चाहिए। –

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