मैं LINQPad में इस नमूने की कोशिश की:
void Main()
{
var cats = new [] { new Cat() };
FirstMethod(cats);
SecondMethod(cats);
}
interface Animal
{
}
class Cat : Animal
{
}
void FirstMethod<T>(T a) where T : IEnumerable<Animal>
{
var b = a.FirstOrDefault();
}
void SecondMethod<T>(IEnumerable<T> a) where T : Animal
{
var b = a.FirstOrDefault();
}
उत्पन्न आईएल कोड को देख कर, वहाँ तरीकों को 2 कॉल के बीच कोई अंतर नहीं है और वे दोनों cats
पैरामीटर के रूप में स्वीकार करते हैं।
संपादित करें: मतभेदों के तरीकों में होते हैं, जैसा कि नीचे देखा। (आप @servy धन्यवाद टिप्पणी के लिए)
IL_001D: ldarg.0
IL_001E: ldloc.0 // cats
IL_001F: call UserQuery.FirstMethod
IL_0024: nop
IL_0025: ldarg.0
IL_0026: ldloc.0 // cats
IL_0027: call UserQuery.SecondMethod
FirstMethod:
IL_0000: nop
IL_0001: ldarg.1
IL_0002: box 02 00 00 1B
IL_0007: call System.Linq.Enumerable.FirstOrDefault
IL_000C: stloc.0 // b
IL_000D: ret
SecondMethod:
IL_0000: nop
IL_0001: ldarg.1
IL_0002: call 05 00 00 2B
IL_0007: stloc.0 // b
IL_0008: ret
इस आईएल कोड पर एक decompiler का उपयोग करना दिखाता है, जहां मुक्केबाजी प्रकार सुरक्षा सुनिश्चित करने से होता है।
private void Main()
{
Cat[] a = new Cat[1]
{
new Cat()
};
this.FirstMethod<Cat[]>(a);
this.SecondMethod<Cat>((IEnumerable<Cat>) a);
}
private void FirstMethod<T>(T a) where T : IEnumerable<Animal>
{
Enumerable.FirstOrDefault<Animal>((IEnumerable<Animal>) a);
}
private void SecondMethod<T>(IEnumerable<T> a) where T : Animal
{
Enumerable.FirstOrDefault<T>(a);
}
स्रोत
2014-11-17 16:10:54
यह पैरामीटर के साथ आप जो करते हैं उस पर निर्भर करता है। दोनों समान नहीं हैं, लेकिन मतभेद किसी विशेष कार्यान्वयन के लिए जर्मन हो सकते हैं या नहीं भी हो सकते हैं। दोनों कार्यात्मक रूप से अलग हैं, इसलिए प्रदर्शन प्राथमिक चिंता नहीं होगी, यह वही है जो वे वास्तव में करेंगे। – Servy