2008-09-19 13 views
5

मान लीजिए कि हम निम्न विधि घोषणा करते हैं:वीबीएनईटी वैकल्पिक पैरामीटर कैसे 'हुड के तहत' काम करते हैं? क्या वे सीएलएस-अनुरूप हैं?

Public Function MyMethod(ByVal param1 As Integer, _ 
    Optional ByVal param2 As Integer = 0, _ 
    Optional ByVal param3 As Integer = 1) As Integer 

    Return param1 + param2 + param3 
End Function 

VB.NET कैसे पड़ता है वैकल्पिक पैरामीटर CLR के दायरे के भीतर काम करते हैं? वैकल्पिक पैरामीटर सीएलएस-अनुरूप हैं?

उत्तर

7

दिलचस्प बात यह है कि यह डीकंपील्ड सी # कोड, परावर्तक के माध्यम से प्राप्त किया।

public int MyMethod(int param1, 
        [Optional, DefaultParameterValue(0)] int param2, 
        [Optional, DefaultParameterValue(1)] int param3) 
{ 
    return ((param1 + param2) + param3); 
} 

वैकल्पिक और डिफ़ॉल्ट पैरामीटर वैल्यू विशेषताओं पर ध्यान दें। उन्हें सी # विधियों में डालने का प्रयास करें। आप पाएंगे कि आपको अभी भी विधि को मान पास करने की आवश्यकता है। वीबी कोड में हालांकि, यह डिफ़ॉल्ट में बदल गया! ऐसा कहा जा रहा है कि, मैंने व्यक्तिगत रूप से कभी भी वीबी कोड में डिफ़ॉल्ट का उपयोग नहीं किया है। यह एक हैक की तरह लगता है। विधि अधिभार मेरे लिए चाल है।

एक्सेल इंटरऑप से निपटने के दौरान डिफ़ॉल्ट मदद करता है, जो सी # में बॉक्स के बाहर सीधे उपयोग करने के लिए गधे में दर्द होता है।

+0

यह बहुत अच्छा है ... मैंने इसे प्रतिबिंबित करने में सी # पर वापस नहीं ले लिया; अनुमान है कि मुझे होना चाहिए! –

+0

मुझे नहीं लगता कि वैकल्पिक मान वैकल्पिक मानकों को देने के लिए डिफ़ॉल्ट मान के कारण अधिभार के समान हैं। आप इसे ओवरलोडिंग के साथ नकली बना सकते हैं लेकिन यह पूरी तरह से समान नहीं है। IMHO। मैं केवल कभी-कभी उनका उपयोग करता हूं। – chrissie1

6

लोकप्रिय धारणा के विपरीत, वैकल्पिक पैरामीटर सीएलएस-अनुरूप दिखाई देते हैं। (हालांकि, इसके लिए मेरी प्राथमिक जांच असेंबली, कक्षा और विधि को 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 

पैरामीटर पर [ऑप्ट] चिह्नों पर ध्यान दें - एमएसआईएल किसी भी हैक के बिना इस मूल रूप से समर्थन करता है। (वीबी के स्टेटिक कीवर्ड के लिए एमएसआईएल के समर्थन के विपरीत, जो एक और विषय है।)

तो, इन्हें सी # में क्यों नहीं हैं? मैं इसका जवाब नहीं दे सकता, मेरी अटकलों के अलावा कि यह मांग की अनुमानित कमी हो सकती है। मेरी खुद की वरीयता हमेशा पैरामीटर निर्दिष्ट करने के लिए रही है, भले ही वे वैकल्पिक थे - मेरे लिए, कोड क्लीनर दिखता है और पढ़ने में आसान है। (यदि छोड़े गए पैरामीटर हैं, तो मैं अक्सर एक ओवरलोड के लिए पहली बार देखता हूं जो दृश्य हस्ताक्षर से मेल खाता है - यह केवल तब होता है जब मैं महसूस करता हूं कि वैकल्पिक पैरामीटर शामिल हैं।)

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