2017-02-02 3 views
7

पर इंटरफ़ेस को कार्यान्वित करना मैं प्रोग्रामिंग पाठ्यक्रम में जो कुछ पाया, उससे काफी उलझन में हूं। एक ही सटीक प्रभाव हम कर सकते हैं हासिल कर सकते हैं का उपयोग कर सिर्फ इस -एक जेनेरिक विधि पैरामीटर के लिए इंटरफ़ेस कार्यान्वित करना एक विधि तर्क

public void MethodA<T>(T a) where T : IComparable 
    { 
     //... 
    } 

और जहाँ तक मुझे पता है:

public void MethodB(IComparable a) 
    { 
     //... 
    } 

हैं -

संक्षेप में मैं एक तरीका है जिसके कि निर्माण है पाया उन दो तरीकों से किसी एक दूसरे से भिन्न होता है और उनमें से एक दूसरे पर कोई फायदा होता है? यदि हां, तो एक परिदृश्य कैसे दिख सकता है जहां उनमें से एक उपयोग करने के लिए बेहतर है?

बहुत बहुत धन्यवाद!

+1

पहले मामले में विधि के पैरामीटर के रूप में अधिक विशिष्ट प्रकार होगा लेकिन उस प्रकार के आईसीएमपरेबल के साथ विरासत में भी विरासत होगी, जबकि दूसरे मामले में आपको ऑब्जेक्ट को टाइप करने के लिए आईसीओम्पेरबल –

+1

टाइप करना होगा, लेकिन मैं निश्चित नहीं हूं, लेकिन मैं अनुमान लगाएं कि आपके पास 'स्ट्रक्चर' है जो 'आईसीओपरपेबल' लागू करता है, तो पहली विधि को कॉल करने से बॉक्स को बॉक्स नहीं किया जाएगा, जबकि दूसरे को कॉल करते समय 'स्ट्रक्चर' की आवश्यकता होगी। –

+0

आप हमेशा 'सार्वजनिक शून्य विधि (IComparable टी) जा सकते हैं। –

उत्तर

5

मैं तो मैं एक छोटे से testcode अपने आप बनाया उत्सुक था:

public interface ITest 
{ 
    int Value { get; set; } 
} 
public struct TestStruct : ITest 
{ 
    public int Value { get; set; } 
} 

private static void TestMethodGeneric<T>(T value) where T : ITest 
{ 
} 
private static void TestMethodNonGeneric(ITest value) 
{ 
} 

और मेरे मुख्य विधि में मैं दोनों कॉल का उपयोग करें:

TestStruct ts = new TestStruct {Value = 10}; 
TestMethodNonGeneric(ts); 
TestMethodGeneric(ts); 

और यह परिणामस्वरूप आईएल कोड है:

गैर-जेनेरिक:

IL_0031: ldloc.0  // ts 
IL_0032: box   Tests.Program/*02000002*//TestStruct/*02000026*/ 
IL_0037: call   void Tests.Program/*02000002*/::TestMethodNonGeneric(class Tests.Program/*02000002*//ITest/*02000025*/)/*06000002*/ 
IL_003c: nop   

जेनेरिक:

IL_0059: ldloc.0  // ts 
IL_005a: call   void Tests.Program/*02000002*/::TestMethodGeneric<valuetype Tests.Program/*02000002*//TestStruct/*02000026*/>(!!0/*valuetype Tests.Program*//*02000002*//*/TestStruct*//*02000026*//**/)/*06000001*/ 
IL_005f: nop 

तो आप देखते हैं, जेनेरिक वर्जन में, विशेष प्रकार प्रयोग किया जाता है और वजह नहीं मुक्केबाजी होता है।
गैर-जेनेरिक संस्करण में, struct मान ITest पर डाला जाना चाहिए और इसलिए यह बॉक्सिंग हो जाता है। तो जेनेरिक संस्करण में एक (बहुत छोटा) प्रदर्शन लाभ होता है।

बस मेरे दो सेंट, शायद दो दृष्टिकोणों में अन्य कम या ज्यादा महत्वपूर्ण अंतर हो सकते हैं।

+0

कमाल का जवाब! धन्यवाद! –

+0

मैं इस परिदृश्य के लिए व्यक्तिगत रूप से सख्त टाइपिंग (गैर-जेनेरिक) संस्करण पसंद करूंगा जब तक कि मुक्केबाजी वास्तविक समस्या न हो। सामान्य संस्करण थोड़ा अजीब दिखता है। लेकिन मुझे बुलेट प्रूफ तकनीकी तर्क नहीं मिल रहा है। –

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