2011-03-21 11 views
9

हम .NET में किसी ऑब्जेक्ट को पूर्णांक कैसे निर्दिष्ट कर सकते हैं?किसी ऑब्जेक्ट को "int" कैसे दिया जाता है?

संदर्भ प्रकार सिस्टम से प्राप्त किए गए हैं। ऑब्जेक्ट और मान प्रकार सिस्टम से हैं। ValueType।

तो, यह कैसे संभव है?

उत्तर

5

आप boxing किसी ऑब्जेक्ट में पूर्णांक हैं।

है यही कारण है, एक वस्तु बन जाता है कि wraps (या बक्से) पूर्णांक। वास्तविक जीवन में एक बॉक्स में कुछ डालने की तरह।

+0

बॉक्सिंग एक शारीरिक घटना है। यह वास्तव में कैसे होता है (पूर्णांक System.Object से संबंधित नहीं है)? – SeeSharp

+0

उसी दस्तावेज से डीटीबी का उद्धरण इसे अच्छी तरह से प्रस्तुत करता है। – BoltClock

1

पूर्णांक एक अंतर्निहित पूर्णांक प्रकार वस्तु और एक अंतर्निहित रूपांतरण है।

+5

मुझे लगता है कि आप जावा के साथ .NET उलझन में हैं। और कोई अंतर्निहित रूपांतरण नहीं चल रहा है; यह अभी भी एक वस्तु है, एक वस्तु के रूप में छिपा हुआ है। – BoltClock

+0

ओह हाँ मैंने किया। पोस्टिंग से पहले सोचने के लिए समय नहीं लेना मुझे यही मिलता है। –

+0

@ बोल्टक्लॉक असल में, अजीब परिस्थितियों के कारण, पनीर सही प्रकार का है। .NET में 'int' प्रकार (और अन्य संख्यात्मक प्रकार) एक "जादुई" प्रकार है: अकेले' int' मान, केवल 4 बाइट्स है, जिसका अर्थ है कि इसमें RTTI नहीं हो सकता है। केवल तभी जब आप इसे किसी ऑब्जेक्ट (जैसे कि बॉक्स किए गए) के रूप में उपयोग करने का प्रयास करते हैं, तो यह 'System.Integer' उदाहरण के अंदर रखा जाता है, जो केवल एक रैपर होता है। यदि आप प्रतिबिंबक के माध्यम से 'System.Integer' कक्षा को देखते हैं, तो आप देखेंगे कि इसका एकमात्र सदस्य' int m_value' है। तो वहाँ _is_ एक निहित रूपांतरण चल रहा है, केवल एक चीज यह है कि यह अपेक्षाकृत कम स्तर पर होता है कि कोई क्या उम्मीद कर सकता है। – zneak

7

Boxing and Unboxing:

मुक्केबाजी प्रकार वस्तु के लिए या किसी इंटरफ़ेस इस मान प्रकार द्वारा कार्यान्वित प्रकार के एक मान प्रकार परिवर्तित करने की प्रक्रिया है। जब सीएलआर एक मान प्रकार को बक्से करता है, तो यह सिस्टम के अंदर मूल्य को लपेटता है। ऑब्जेक्ट करें और इसे प्रबंधित ढेर पर संग्रहीत करता है। अनबॉक्सिंग ऑब्जेक्ट से मान प्रकार निकालता है।

3

आप ग # है जो आप को बताना चाहिए में boxing and unboxing पर पढ़ना चाहिए कि वे किस तरह/क्यों।

इस कड़ी के लिए एक महान व्याख्या है और बताते हैं संदर्भ बनाम मान प्रकार सवाल आप के बारे में पूछ रहे हैं:

http://www.dijksterhuis.org/exploring-boxing/

मुक्केबाजी के रूप में बस आवरण में एक बुनियादी प्रकार रहा है (यह कर रही है एक पूरी तरह से उड़ा दिया ऑब्जेक्ट), और उस लिपटे ऑब्जेक्ट को लेते हुए अनबॉक्सिंग और इसे वापस एक सरल प्रकार में परिवर्तित कर देता है। मुक्केबाजी प्रबंधित स्मृति को ढेर पर आवंटित करने की आवश्यकता है, संदर्भों को अद्यतन करने की आवश्यकता है, और मूल्य प्रकार की सामग्री की प्रतिलिपि बनाई जानी चाहिए।

4

इस विधि का प्रयास करें:

object ob; 
int i=10; 
ob=i;//(boxing) 
int b; 
b=(int)ob;//(unboxing) 
15

अवधि "बॉक्सिंग" बहुत अपारदर्शी है, लेकिन यह करने के लिए आसान है डीबगर का उपयोग कर वास्तव में क्या चल रहा है कल्पना करें। इस तरह एक छोटा कंसोल मोड एप्लीकेशन लिखें:

using System; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      int value = 42; 
      object obj = value; 
     } // <== Breakpoint here 
    } 
} 

एक ब्रेकपॉइंट सेट करें जहां इंगित किया गया है और F5 दबाएं। जब ब्रेकपॉइंट हिट होता है, डीबग + विंडोज + मेमोरी + मेमोरी का उपयोग करें 1. पता बॉक्स में, "obj" टाइप करें। आपको वस्तु की स्मृति सामग्री का हेक्स डंप मिलेगा। विंडो पर राइट-क्लिक करें और "4-बाइट इंटीजर" चुनें, इस मामले में ऑब्जेक्ट को विज़ुअलाइज़ करने का सबसे अच्छा तरीका। आप इस कुछ मिलता-जुलता दिखाई देंगे:

0x01CBF6BC 6e1a2d34 0000002a 

दिलचस्प यहाँ भागों 0x01CBF6BC कर रहे हैं, कि कचरा एकत्र ढेर पर वस्तु का पता है। अगला हेक्स नंबर, 6e1a2d34 तथाकथित "प्रकार हैंडल" है, जिसे "विधि तालिका सूचक" भी कहा जाता है। वह एक 'कुकी' है जो ऑब्जेक्ट के प्रकार की पहचान करती है। इस मामले में System.Int32। बहुत महत्वपूर्ण है, इसका उपयोग बाद में तब किया जाएगा जब ऑब्जेक्ट को इंट 32 पर वापस अनबॉक्स किया गया है ताकि यह सत्यापित किया जा सके कि बॉक्स किए गए मान वास्तव में एक पूर्णांक हैं।

अगला मूल्य जो आप देखते हैं, 0000002 ए, बॉक्स किए गए ऑब्जेक्ट का मान है। आप प्रोग्रामर मोड में विंडोज कैलक्यूलेटर का उपयोग दशमलव पर वापस करने के लिए कर सकते हैं, यह 42 है।

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

हेक्स डंप मैंने आपको 4 बाइट बॉक्स किए गए मान के लिए दिया था, मुक्केबाजी एक डबल 8 बाइट ले जाएगा। एक संरचना बॉक्सिंग और बाइट ले जाएगा। उस ऑब्जेक्ट हेडर का एक हिस्सा भी है जिसे आप नहीं देख सकते हैं, तथाकथित सिंकब्लॉक, पते पर स्थित - 4. उस परिवर्तन को देखने के लिए लॉक स्टेटमेंट आज़माएं।

+4

+1 उत्कृष्ट व्यायाम; बहुत ही रोचक। –

संबंधित मुद्दे