बॉक्सिंग/अनबॉक्सिंग तब होती है जब एक मान प्रकार (जैसे संरचना, int, long) किसी संदर्भ प्रकार को स्वीकार करता है - जैसे कि object
।
ऐसा तब होता है जब आप स्पष्ट रूप से ऐसी विधि बनाते हैं जो प्रकार ऑब्जेक्ट के पैरामीटर लेता है जो मूल्य प्रकारों को पारित किया जाएगा। यह तब भी आता है जब आप मूल्य प्रकार (आमतौर पर primitives) को स्टोर करने के लिए पुराने गैर-जेनेरिक संग्रह का उपयोग करते हैं।
आप String.Format()
का उपयोग करते समय मुक्केबाजी के दौरान भी देखेंगे और इसके लिए प्राइमेटिव पास करेंगे। ऐसा इसलिए है क्योंकि String.Format()
एक पैरा ऑब्जेक्ट स्वीकार करता है [] - जिसके परिणामस्वरूप कॉल में अतिरिक्त पैरामीटर का मुक्केबाजी होता है।
विधियों को आमंत्रित करने के प्रतिबिंब का उपयोग करने से मुक्केबाजी/अनबॉक्सिंग भी हो सकती है, क्योंकि प्रतिबिंब एपीआई के पास object
वापस करने के अलावा कोई विकल्प नहीं है क्योंकि वास्तविक प्रकार संकलन समय पर ज्ञात नहीं है (और प्रतिबिंब एपीआई जेनेरिक नहीं हो सकते हैं)।
नए जेनेरिक संग्रह का परिणाम मुक्केबाजी/अनबॉक्सिंग में नहीं होता है, और इसलिए इस कारण के लिए पुराने संग्रहों के लिए बेहतर है (उदाहरण के लिए ऐरेलिस्ट, हैशटेबल, आदि)। उल्लेख नहीं है कि वे टाइपएफ़ हैं।
आप सामान्य रूप से वस्तुओं को स्वीकार करने वाले तरीकों को बदलकर मुक्केबाजी चिंताओं से बच सकते हैं।
public void string Decorate(object a) // passing a value type results in boxing
{
return a.ToString() + " Some other value";
}
बनाम: उदाहरण के लिए:
public void string Decorate<T>(T a)
{
return a.ToString() + " some other value";
}
मैं आपसे सहमत हूं। इस विषय पर मैंने जो कुछ भी पढ़ा है, उससे मुझे बस बिंदु नहीं मिला है। कुछ याद आना चाहिए :) –