लोकप्रिय धारणा के विपरीत, वैकल्पिक पैरामीटर सीएलएस-अनुरूप दिखाई देते हैं। (हालांकि, इसके लिए मेरी प्राथमिक जांच असेंबली, कक्षा और विधि को CLSCompliant विशेषता के साथ चिह्नित करना था, सही पर सेट किया गया था।)
तो यह एमएसआईएल में कैसा दिखता है?
.method public static int32 MyMethod(int32 param1,
[opt] int32 param2,
[opt] int32 param3) cil managed
{
.custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
.param [2] = int32(0x00000000)
.param [3] = int32(0x00000001)
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 MyMethod)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: add.ovf
IL_0004: ldarg.2
IL_0005: add.ovf
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method Module1::MyMethod
पैरामीटर पर [ऑप्ट] चिह्नों पर ध्यान दें - एमएसआईएल किसी भी हैक के बिना इस मूल रूप से समर्थन करता है। (वीबी के स्टेटिक कीवर्ड के लिए एमएसआईएल के समर्थन के विपरीत, जो एक और विषय है।)
तो, इन्हें सी # में क्यों नहीं हैं? मैं इसका जवाब नहीं दे सकता, मेरी अटकलों के अलावा कि यह मांग की अनुमानित कमी हो सकती है। मेरी खुद की वरीयता हमेशा पैरामीटर निर्दिष्ट करने के लिए रही है, भले ही वे वैकल्पिक थे - मेरे लिए, कोड क्लीनर दिखता है और पढ़ने में आसान है। (यदि छोड़े गए पैरामीटर हैं, तो मैं अक्सर एक ओवरलोड के लिए पहली बार देखता हूं जो दृश्य हस्ताक्षर से मेल खाता है - यह केवल तब होता है जब मैं महसूस करता हूं कि वैकल्पिक पैरामीटर शामिल हैं।)
स्रोत
2008-09-19 17:55:42
यह बहुत अच्छा है ... मैंने इसे प्रतिबिंबित करने में सी # पर वापस नहीं ले लिया; अनुमान है कि मुझे होना चाहिए! –
मुझे नहीं लगता कि वैकल्पिक मान वैकल्पिक मानकों को देने के लिए डिफ़ॉल्ट मान के कारण अधिभार के समान हैं। आप इसे ओवरलोडिंग के साथ नकली बना सकते हैं लेकिन यह पूरी तरह से समान नहीं है। IMHO। मैं केवल कभी-कभी उनका उपयोग करता हूं। – chrissie1