दिलचस्प पोस्ट
वार्जेंट 'डिफ़ॉल्ट' मशीन नाम कैसे बदल सकता है? सर्वर पर अनुरोध भेजते समय मैं कर्ल के अनुरोध हेडर को कैसे देख सकता / सकती हूं? JQuery अजाक्स अनुरोध: उपयोगकर्ता-एजेंट बदलें समय में स्थैतिक फ़ील्ड्स आरम्भ नहीं किए जाते हैं? जब डिवीज की ऊंचाई jQuery का उपयोग करते हुए बदलती है मैं एक पाठ फ़ाइल के एन्कोडिंग / कोडपेज का पता कैसे लगा सकता हूं? Android में इनकमिंग कॉल के फ़ोन नंबर को पुनर्प्राप्त करें defaultCalendarForNewEvents विफल हुआ Jquery.dialog में एक आंशिक दृश्य लोड हो रहा है एक यादृच्छिक संख्या उत्पन्न करने के लिए रैंड का उपयोग कर मेरे एंड्रॉइड एप्लिकेशन में पीडीएफ कैसे पढ़ा जाए? एमवीसी रेजर देखें नेस्टेड फॉरचास मॉडल बहु-भाग की पहचानकर्ता बाध्य नहीं हो सका मैं एक उल्टे गिट कमिट को "अन-रिवर्ट" कैसे कर सकता हूं? जावा 8 लाम्बा फ़ंक्शंस जो अपवाद फेंकता है?

मुक्केबाजी और अनबॉक्सिंग क्या है और व्यापार बंद क्या हैं?

मैं एक स्पष्ट, संक्षिप्त और सटीक उत्तर ढूंढ रहा हूं।

आदर्श रूप में वास्तविक उत्तर, हालांकि अच्छा स्पष्टीकरण के लिए स्वागत है स्वागत है

वेब के समाधान से एकत्रित समाधान "मुक्केबाजी और अनबॉक्सिंग क्या है और व्यापार बंद क्या हैं?"

बॉक्सिंग मान डेटा स्ट्रक्चर होते हैं, जो कि आदिम प्रकारों के आसपास न्यूनतम रैपर हैं। बॉक्स किए गए मूल्यों को आमतौर पर ढेर पर ऑब्जेक्ट्स के लिए पॉइंटर्स के रूप में संग्रहित किया जाता है।

इस प्रकार, बॉक्सिंग मान अधिक मेमोरी का उपयोग करते हैं और कम से कम दो मेमोरी लुकअप को एक्सेस करने के लिए उपयोग करते हैं: पॉइंटर पाने के लिए एक बार, और दूसरे को उस पॉइंटर को आदिम के बाद का पालन करने के लिए। जाहिर है, यह आपके अंदरूनी लूप में की तरह की बात नहीं है। दूसरी ओर, बॉक्स्ड वैल्यू आमतौर पर सिस्टम में अन्य प्रकार के साथ बेहतर खेलती है। चूंकि वे भाषा में प्रथम श्रेणी के डेटा संरचना हैं, इसलिए उनके पास अपेक्षित मेटाडेटा और संरचना है जो अन्य डेटा संरचनाओं के पास है।

जावा और हास्केल जेनेरिक संग्रह में बिना बॉक्स किए गए मान शामिल नहीं हो सकते। .NET में जेनेरिक संकलन बिना दंड के बिना अबाधित मूल्यों को पकड़ सकता है। जहां जावा के जेनेरिक्स का उपयोग केवल संकलन-समय प्रकार की जांच के लिए किया जाता है, एनएटी प्रत्येक सामान्य प्रकार के लिए विशिष्ट कक्षाएं उत्पन्न करेगा जो रन टाइम पर चालू होता है ।

जावा और हास्केल में अनबॉक्सित एरेज़ हैं, लेकिन वे दूसरे संग्रहों से स्पष्ट रूप से कम सुविधाजनक हैं। हालांकि, जब पीक प्रदर्शन की आवश्यकता होती है तो मुक्केबाजी के ऊपर से बचने और अनबॉक्सिंग से बचने के लिए थोड़ी असुविधा होती है।

* इस चर्चा के लिए, एक प्रारंभिक मान किसी भी है जिसे कॉल स्टैक पर संग्रहीत किया जा सकता है, बजाय ढेर के मूल्य के लिए पॉइंटर के रूप में संग्रहीत किया जाता है। अक्सर यह बस मशीन प्रकार (ints, floats, आदि), structs, और कभी कभी स्थिर आकार arrays है। .NET- भूमि उन्हें मूल्य प्रकार कहते हैं (संदर्भ प्रकारों के विपरीत)। जावा लोग उन्हें आदिम प्रकार कहते हैं हास्केलियन सिर्फ उन्हें अनबॉक्सित कॉल करते हैं।

** मैं इस उत्तर में जावा, हास्केल, और सी # पर भी ध्यान केंद्रित कर रहा हूं, क्योंकि यही मैं जानता हूं। इसके लिए क्या है, पायथन, रूबी, और जावास्क्रिप्ट सभी में विशेष रूप से बॉक्सिंग मान हैं इसे "सब कुछ एक वस्तु है" दृष्टिकोण के रूप में भी जाना जाता है ***।

*** चेतावनी: एक पर्याप्त उन्नत संकलक / जीआईटी कुछ मामलों में वास्तव में पता लगा सकता है कि एक मूल्य जो कि स्रोत को देखते हुए शब्दों का मिलान किया जाता है, तो रनटाइम पर सुरक्षित रूप से एक अनब्लॉक मान हो सकता है संक्षेप में, शानदार भाषा लागूकर्ताओं के लिए आपका बॉक्स कभी-कभी मुफ्त होते हैं

संक्षेप में सी # 3.0 से:

मुक्केबाजी एक संदर्भ प्रकार में मूल्य प्रकार कास्टिंग करने का कार्य है:

 int x = 9; object o = x; // boxing the int 

अनबॉक्सिंग है … रिवर्स:

 // unboxing o object o = 9; int x = (int)o; 

मुक्केबाजी और अनबॉक्सिंग एक आदिम मूल्य को ऑब्जेक्ट ओरिएंटेड आवरण क्लास (मुक्केबाजी) में परिवर्तित करने की प्रक्रिया है, या ऑब्जेक्ट ओरिएंटेड आवरण क्लास से वापस आदिम मान (अनबॉक्सिंग) के लिए मूल्य परिवर्तित करना है।

उदाहरण के लिए, जावा में, यदि आप Collection में इसे संग्रहित करना चाहते हैं, तो एक Integer (मुक्केबाजी) में एक int वैल्यू को परिवर्तित करने की आवश्यकता हो सकती है, क्योंकि पुरातन Collection में संग्रहीत नहीं किए जा सकते, केवल ऑब्जेक्ट्स लेकिन जब आप इसे Collection से वापस प्राप्त करना चाहते हैं तो आप वैल्यू को int रूप में प्राप्त कर सकते हैं और एक Integer नहीं है, इसलिए आप इसे अनब्लॉक करेंगे

मुक्केबाजी और अनबॉक्सिंग स्वाभाविक रूप से खराब नहीं है, लेकिन यह एक ट्रेडऑफ है भाषा के कार्यान्वयन के आधार पर, यह केवल प्राथमिकताओं के उपयोग से गहरा और धीमी गति से स्मृति हो सकती है। हालांकि, यह आपको उच्च स्तर के डेटा संरचनाओं का उपयोग करने और आपके कोड में अधिक लचीलापन प्राप्त करने की अनुमति भी दे सकता है।

इन दिनों, जावा के (और अन्य भाषा के) "ऑटोबॉक्सिंग / ऑटॉन्बॉक्स्कींग" सुविधा के संदर्भ में यह सबसे अधिक चर्चा की जाती है। यहां ऑटोबॉक्सिंग का जावा स्पष्टीकरण दिया गया है ।

कुल मिलाकर:

अक्सर आप इस बात पर भरोसा नहीं कर सकते कि एक फ़ंक्शन का उपयोग किस प्रकार के चर का होता है, तो आपको एक ऑब्जेक्ट वेरिएबल का उपयोग करने की आवश्यकता होती है जो न्यूनतम कम से कम भिन्नता से फैली हुई है। नेट में यह object

हालांकि object एक क्लास है और इसकी सामग्री को संदर्भ के रूप में संग्रहीत करता है

 List<int> notBoxed = new List<int> { 1, 2, 3 }; int i = notBoxed[1]; // this is the actual value List<object> boxed = new List<object> { 1, 2, 3 }; int j = (int) boxed[1]; // this is an object that can be 'unboxed' to an int 

हालांकि इन दोनों में एक ही जानकारी है दूसरी सूची बड़ी और धीमी है दूसरी सूची में प्रत्येक मान वास्तव में उस object संदर्भ है जो int धारण करता है।

इसे बॉक्सिंग कहा जाता है क्योंकि int object द्वारा लिपटे है। जब int को वापस लाया जाता है तो उसे अनबॉक्सित किया जाता है – इसके मूल्य में वापस परिवर्तित होता है

मूल्य प्रकारों के लिए (अर्थात सभी structs ) यह धीमा है, और संभावित रूप से बहुत अधिक स्थान का उपयोग करता है।

संदर्भ प्रकारों (यानी सभी classes ) के लिए यह एक समस्या का बहुत कम है, क्योंकि वे संदर्भ के रूप में भी संग्रहित हैं।

बॉक्सले मूल्य प्रकार के साथ एक और समस्या यह है कि यह स्पष्ट नहीं है कि आप मूल्य के बजाय बॉक्स के साथ काम कर रहे हैं। जब आप दो structs तुलना करते हैं तो आप मूल्यों की तुलना कर रहे हैं, लेकिन जब आप दो classes तुलना करते हैं तो (डिफ़ॉल्ट रूप से) आप संदर्भ की तुलना कर रहे हैं – यानी ये वही उदाहरण हैं?

बॉक्सिंग मान प्रकारों से निपटने में यह भ्रमित हो सकता है:

 int a = 7; int b = 7; if(a == b) // Evaluates to true, because a and b have the same value object c = (object) 7; object d = (object) 7; if(c == d) // Evaluates to false, because c and d are different instances 

आस-पास काम करना आसान है:

 if(c.Equals(d)) // Evaluates to true because it calls the underlying int's equals if(((int) c) == ((int) d)) // Evaluates to true once the values are cast 

हालांकि, बॉक्सिंग मानों से निपटने के बारे में सावधानी बरतने के लिए एक और बात है।

.NET एफसीएल जेनेरिक संग्रह:

 List<T> Dictionary<TKey, UValue> SortedDictionary<TKey, UValue> Stack<T> Queue<T> LinkedList<T> 

सभी को मुक्केबाजी के प्रदर्शन के मुद्दों और पिछली संग्रह कार्यान्वयन में अनबॉक्स्ड पर काबू पाने के लिए डिज़ाइन किया गया था।

अधिक जानकारी के लिए अध्याय 16, सीएलआर सी # (2 संस्करण) देखें

मुक्केबाजी एक संदर्भ प्रकार में एक मूल्य प्रकार के रूपांतरण की प्रक्रिया है।

अनबॉक्सिंग एक संदर्भ प्रकार का मूल्य प्रकार में रूपांतरण है।

 EX: int i=123; object o=i;// Boxing int j=(int)o;// UnBoxing 

मान प्रकार हैं:
इंट, चार और संरचनाएं, एन्यूमरेशन संदर्भ प्रकार हैं: क्लासेस, इंटरफेस, एरे, स्ट्रिंग्स और ऑब्जेक्ट्स

मुक्केबाजी और अनबॉक्सिंग वस्तुओं के रूप में माना जाने वाला मूल्य प्रकार की सुविधा देता है बॉक्सिंग का मतलब ऑब्जेक्ट संदर्भ प्रकार के एक उदाहरण के लिए एक मान को परिवर्तित करना है। उदाहरण के लिए, Int एक वर्ग है और int एक डेटा प्रकार है। int को Int में परिवर्तित करना मुक्केबाजी का एक उदाहरण है, जबकि Int से Int को परिवर्तित करना अनबॉक्सिंग है। अवधारणा कचरा संग्रह में मदद करती है, दूसरी ओर, अनबॉक्सिंग, ऑब्जेक्ट प्रकार को वैल्यू टाइप में कनवर्ट करती है।

 int i=123; object o=(object)i; //Boxing o=123; i=(int)o; //Unboxing. 

कुछ और की तरह, अगर सावधानी से उपयोग नहीं किया जाता है तो ऑटोबॉक्सिंग समस्याग्रस्त हो सकता है क्लासिक एक NullPointerException के साथ समाप्त करने के लिए है और इसे नीचे ट्रैक करने में सक्षम नहीं है। डिबगर के साथ भी इसे इस्तेमाल करे:

 public class TestAutoboxNPE { public static void main(String[] args) { Integer i = null; // .. do some other stuff and forget to initialise i i = addOne(i); // Whoa! NPE! } public static int addOne(int i) { return i + 1; } }