2011-03-21 9 views
14

क्या निरंतर ऑब्जेक्ट बनाने का कोई तरीका है (यानी इसे संपादित नहीं किया जा सकता है और संकलन समय पर बनाया गया है)?सी # "निरंतर ऑब्जेक्ट्स" को डिफ़ॉल्ट पैरामीटर के रूप में उपयोग करने के लिए

मैं सिर्फ सी # भाषा के साथ खेल रहा हूं और वैकल्पिक पैरामीटर सुविधा को देखा और सोचा कि यह वैकल्पिक पैरामीटर के रूप में डिफ़ॉल्ट ऑब्जेक्ट का उपयोग करने में सक्षम होने के लिए साफ हो सकता है। निम्नलिखित पर विचार करें:

//this class has default settings 
private const SettingsClass DefaultSettings = new SettingsClass(); 

public void doSomething(SettingsClass settings = DefaultSettings) 
{ 

} 

यह स्पष्ट रूप से संकलित नहीं होता है, लेकिन यह एक उदाहरण है जो मैं करना चाहता हूं। क्या इस तरह एक निरंतर वस्तु बनाना संभव है और इसे वैकल्पिक पैरामीटर के लिए डिफ़ॉल्ट के रूप में उपयोग करना संभव होगा ??

+1

बस एक तरफ: भाषा सुविधाओं का उपयोग करने से बचें क्योंकि आप कर सकते हैं। उनका उपयोग करें क्योंकि वे नौकरी के लिए सही उपकरण हैं। डिफ़ॉल्ट पैरामीटर आप जो करना चाहते हैं उसके लिए सही उपकरण नहीं हैं। चीयर्स! – Jon

+1

यदि यह पायथन था, तो यह डिफ़ॉल्ट पैरामीटर का पूरी तरह से स्वीकार्य उपयोग होगा। मुझे कोई कारण नहीं दिखता कि डिफ़ॉल्ट पैरामीटर नौकरी के लिए सही उपकरण नहीं हैं (तथ्य यह है कि यह सी # में मान्य नहीं है)। – Gabe

उत्तर

25

नहीं, वैकल्पिक पैरामीटर के लिए डिफ़ॉल्ट मान संकलन-समय स्थिरांक होने की आवश्यकता है।

आपके मामले में, एक समाधान होगा:

public void doSomething(SettingsClass settings = null) 
{ 
    settings = settings ?? DefaultSettings; 
    ... 
} 
+0

जब तक आप 'शून्य' कुछ गैर-डिफ़ॉल्ट करने के लिए नहीं चाहते थे। –

+0

यह एक अच्छा समाधान है ... कभी नहीं देखा ?? इससे पहले ... शून्य coalescing lol ... जब आपको लगता है कि आप सी # पता है ... – user623879

+0

अच्छा है, धन्यवाद! –

4

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

public void doSomething() 
{ 
    var settings = // get your settings here any way you like 
    this.doSomething(settings); 
} 

public void doSomething(SettingsClass settings) 
{ 
    // implementation 
} 

यह काम करता है, भले ही पैरामीटर एक मान प्रकार है:

आप यदि आप कई भार के के पूर्व सी # 4 प्रतिमान के साथ वैकल्पिक पैरामीटर को बदलने के वांछित कार्यशीलता को प्राप्त कर सकते हैं।

+0

सहमत हुए, लेकिन मैं वैकल्पिक पैरामीटर विधि की तलाश में था। – user623879

+0

@ user623879: मैंने एक नया पहला पैराग्राफ जोड़ा, जो उत्तर को और अधिक पूरा करता है। – Jon

+0

@User: यह वास्तव में कोई फर्क नहीं पड़ता; इस मामले में पैरामीटर वैकल्पिक भी है। आईएमएचओ जोन्स विधि अनिस के लिए निर्विवाद रूप से बेहतर है। –

0

आप कॉन्स्ट के बजाय, केवल पढ़ने योग्य विशेषता का उपयोग कर सकते हैं। उदाहरण के लिए:

//this class has default settings 
private readonly SettingsClass DefaultSettings = new SettingsClass(); 

public void doSomething(SettingsClass settings = DefaultSettings) 
{ 
} 
+2

यह संकलित नहीं होता है। –

+2

यह काम नहीं करता –

+0

काम नहीं करता है, केवल पढ़ने के लिए! = Const, const संकलन पर मूल्यांकन किया जाता है जबकि पाठक रनटाइम पर होगा। कॉन्स को रेखांकित किया जाएगा और केवल पढ़ा नहीं जाएगा –

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