मैं तो मैं एक छोटे से 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
पर डाला जाना चाहिए और इसलिए यह बॉक्सिंग हो जाता है। तो जेनेरिक संस्करण में एक (बहुत छोटा) प्रदर्शन लाभ होता है।
बस मेरे दो सेंट, शायद दो दृष्टिकोणों में अन्य कम या ज्यादा महत्वपूर्ण अंतर हो सकते हैं।
स्रोत
2017-02-02 08:00:24
पहले मामले में विधि के पैरामीटर के रूप में अधिक विशिष्ट प्रकार होगा लेकिन उस प्रकार के आईसीएमपरेबल के साथ विरासत में भी विरासत होगी, जबकि दूसरे मामले में आपको ऑब्जेक्ट को टाइप करने के लिए आईसीओम्पेरबल –
टाइप करना होगा, लेकिन मैं निश्चित नहीं हूं, लेकिन मैं अनुमान लगाएं कि आपके पास 'स्ट्रक्चर' है जो 'आईसीओपरपेबल' लागू करता है, तो पहली विधि को कॉल करने से बॉक्स को बॉक्स नहीं किया जाएगा, जबकि दूसरे को कॉल करते समय 'स्ट्रक्चर' की आवश्यकता होगी। –
आप हमेशा 'सार्वजनिक शून्य विधि (IComparable टी) जा सकते हैं। –