2014-10-07 4 views
6

EDIT 1 में डिफ़ॉल्ट विधि पैरामीटर संकलित-समय स्थिरांक क्यों होना चाहिए 1: मुझे पता है कि टेलीस्कोपिंग जैसे विकल्प हैं, यह एक विशुद्ध रूप से शैक्षिक प्रश्न था।सी #

मुझे पता है कि यह सच है, लेकिन यह क्यों होना चाहिए?

public class Foo{ 

    private int bar; 

    public void SetBar(int baz = ThatOtherClass.GetBaz(3)){ 
     this.bar = baz; 
    } 

} 

संकलक कुछ इस तरह करने के लिए विधि को बदल सकता है:: यह कुछ इस तरह से की तरह लगता है

public void SetBar(int baz){ 

//if baz wasn't passed: 
baz = ThatOtherClass.GetBaz(3); 

this.bar = baz; 

} 

क्यों नहीं होगा कि काम, या होगा यह, और यह सिर्फ एक डिजाइन निर्णय होता है ?

+0

क्योंकि रनटाइम मानों और संकलन-समय मानों के बीच कोई अंतर हो सकता है। क्या होगा यदि कोडर वहां संकलित-समय मान "हार्डकोडेड" चाहता था, लेकिन GetBaz() फिर रनटाइम पर कुछ अलग करता है और प्रोग्राम को फटकार से बाहर फेंक देता है? –

+5

यदि आप जानना चाहते हैं कि क्यों सी # भाषा टीम ने एक सुविधा लागू नहीं की है तो उनसे यादृच्छिक डेवलपर्स की बजाय उनसे पूछें जिनके पास भाषा के निर्माण से कोई लेना देना नहीं था। हम नहीं जानते कि उन्होंने इस सुविधा को लागू नहीं करने का फैसला क्यों किया। – Servy

+1

आपके पास हमेशा –

उत्तर

7

कल्पना तो कहते हैं क्योंकि:

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

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

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

एक • है •: एक डिफ़ॉल्ट तर्क में अभिव्यक्ति निम्न में से एक होना चाहिए फॉर्म डिफ़ॉल्ट (एस) की अभिव्यक्ति जहां एस एक मान प्रकार

क्यों भाषा डिजाइनरों ने ऐसा करने का विकल्प चुना है, कि हम केवल अनुमान लगा सकते हैं। हालांकि, कल्पना का एक अन्य हिस्सा एक जवाब पर संकेत:

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

+0

हाँ यह एक अच्छा बिंदु है, यदि आप अपने डिफ़ॉल्ट मानों के रूप में विधियों का उपयोग करते हैं, तो यदि आपके पास एक से अधिक डिफ़ॉल्ट मान हैं और उस समय कौन से तरीकों को निष्पादित किया जाना चाहिए –