यदि आप के लिए Method
की परिभाषा बदल आप मुक्केबाजी बच सकते हैं:
void Method<T>(T i) where T : I
{
}
यह मुक्केबाजी से बचा जाता है, क्योंकि कार्यावधि में CLR सामान्य तर्क (रों) के प्रकार के आधार सामान्य तरीकों माहिर हैं। संदर्भ प्रकार सभी एक ही कार्यान्वयन साझा कर सकते हैं, जबकि संरचना प्रकारों को प्रत्येक का अपना संस्करण मिलता है। इसका मतलब है Method
में सभी परिचालन जो T
पर निर्भर करते हैं, कंक्रीट संरचना प्रकार के आकार को ध्यान में रखेंगे।
आपको सावधान हालांकि, आभासी तरीकों System.Object
Equals
या GetHashCode
की तरह पर परिभाषित i
कारण होगा बुला आभासी विधि प्रेषण के बाद बॉक्सिंग किए जाने के बाद से किया जाना चाहिए, हालांकि JIT कुछ में स्थिर प्रेषण करने में सक्षम हो सकता है एक विधि तालिका सूचक की आवश्यकता है (मामले)। हालांकि, यदि आपका स्ट्रक्चर प्रकार वर्चुअल विधि को प्रश्न में ओवरराइड करता है, तो मुक्केबाजी को करने की आवश्यकता नहीं होगी, क्योंकि कॉल करने की विधि को फिर से स्थिर माना जाता है क्योंकि structs (और इसलिए उनके सदस्यों) को सील कर दिया जाता है।
आमतौर पर आप सीधे T
आगे बाधित IEquatable<T>
लागू करने के लिए और जैसे तुलना के लिए एक IEqualityComparer<T>
का उपयोग करके Equals
या GetHashCode
बुला से बच सकते हैं
void Method<T>(T i) where T : I, IEquatable<T>
{
T other = ...
if(i.Equals(other)) //avoids boxing
{
}
}
एक संभावित साक्षात्कार प्रश्न की तरह लगता है के लिए ... मुझे याद है कि एक –