2010-08-10 15 views
8

मुझे निम्न कोड मिला:मुक्केबाजी और अनबॉक्सिंग, "System.Object" दोनों आउटपुट क्यों नहीं हैं?

object var3 = 3; 
Console.WriteLine(var3.GetType().ToString()); 
Console.WriteLine(typeof(object).ToString()); 

आउटपुट है:

System.Int32 
System.Object 

वे दोनों System.Object क्यों नहीं हैं?

+0

@ ओएसओ ओपी, दोनों कंसोल। राइटलाइन, स्पष्ट ToString() के बिना भी काम करेंगे - यह निश्चित रूप से आपके तर्क के रूप में बुलाया जाएगा प्रकार एक वस्तु है। – Gishu

+0

हटा दिया गया अभिवादन: "अग्रिम धन्यवाद।" ने शीर्षक से अवैध शब्दों को भी हटा दिया: "प्रश्न के बारे में", अगली बार ऐसा न करें –

उत्तर

4

तुम क्यों boxedObject.GetType() वस्तु वापस नहीं करता है पूछ रहे हैं .. MSDN Boxing and Unboxing page पर जांच छवि धारा 'मुक्केबाजी रूपांतरण' के तहत है। अच्छा सवाल btw .. कम से कम आपके प्रश्न की मेरी समझ।

हालांकि मैं तकनीकी रूप से सही नहीं हो सकता है, ऐसा लगता है

  • जब ढेर के लिए चले गए की तरह, एक नई वस्तु बनाई गई है - अपने प्रकार सूचक मूल मान प्रकार के प्रकार वस्तु (यहाँ प्रणाली के लिए निर्धारित किया है। int32)। यह GetType() को बताता है (और अगर आप इसे किसी अन्य प्रकार से अनबॉक्स करने का प्रयास करते हैं तो त्रुटि भी)।
  • वास्तविक मूल्य तब इस ऑब्जेक्ट में कॉपी किया गया है।
7

GetType() फ़ंक्शन वैरिएबल में वास्तविक प्रकार का उदाहरण देता है।

भले ही आपके चर object के रूप में घोषित किया जाता है, यह वास्तव में एक बॉक्स्ड Int32 उदाहरण पकड़े है।

+0

मुझे नहीं पता कि अन्य उत्तरों क्या साबित करने की कोशिश कर रहे हैं :) – leppie

+1

मुझे लगता है कि उसका प्रश्न ऑब्जेक्ट के बजाय बॉक्स की गेटटाइप (ऑब्जेक्ट) इंट 32 (बॉक्स किए गए मान का प्रकार) लौटाता है - क्योंकि मुक्केबाजी ने इसे ढेर पर ऑब्जेक्ट बनाने का कारण बनता है। यदि आपको +1 – Gishu

+0

@leppie नहीं मिल रहा है: वहां निश्चित रूप से उनमें से बहुत सारे हैं, वहां नहीं हैं :) –

3

मुक्केबाजी के विषय को अनदेखा करते हुए, सभी वर्ग टाइप ऑब्जेक्ट से प्राप्त होते हैं। यह संदर्भ प्रकार और मूल्य प्रकार दोनों के लिए सच है। GetType सबसे व्युत्पन्न प्रकार दिखाता है, जो इस मामले में System.Int32 है।

object var = new Object(); 
Console.WriteLine(var.GetType().ToString()); 

मुक्केबाजी जब एक मान प्रकार एक संदर्भ प्रकार के आधार पर की ओर इशारा किया है को संदर्भित करता:

कई बार GetType System.Object वापस जाने के लिए जा रहा है में से एक यदि आप ऐसा करते है। आम तौर पर यह एक सिस्टम के रूप में किया जाता है। ऑब्जेक्ट संदर्भ। TypeOf सबसे व्युत्पन्न वास्तविक प्रकार वापस करेगा, संदर्भ प्रकार नहीं।

class A 
{ 
} 

class B : A 
{ 
} 

class C : B 
{ 
} 

object obj1 = new ClassA(); 
ClassB obj2 = new ClassB(); 
ClassB obj3 = new ClassC(); 

GetType इन प्रकार के लिए इसी तरह की बातें करते हैं जाएगा।

System.Console.WriteLine(obj1.GetType().ToString()); 
System.Console.WriteLine(obj2.GetType().ToString()); 
System.Console.WriteLine(obj3.GetType().ToString()); 

ClassA
ClassB
ClassC

+0

मूल्य प्रकार वास्तव में ऑब्जेक्ट से प्राप्त नहीं होते हैं। वे पूरी तरह से पदानुक्रम के बाहर हैं। हालांकि, प्रत्येक मूल्य प्रकार के लिए, एक वर्ग प्रकार होता है जो विडंबनापूर्ण नामित वैल्यू टाइप से प्राप्त होता है (इसके नाम के बावजूद, यह एक वर्ग प्रकार है)। प्रणाली प्रत्येक मूल्य प्रकार और उसके संबंधित ऑटो-जेनरेटेड क्लास प्रकार के बीच अंतर्निहित बिडरेक्शनल रूपांतरण ऑपरेटरों को परिभाषित करती है। किसी मान प्रकार से कक्षा प्रकार में अंतर्निहित रूपांतरण को "मुक्केबाजी" कहा जाता है; रिवर्स रूपांतरण "अनबॉक्सिंग" है। – supercat

+0

@supercat: अगर आप चाहें तो उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें :) –

1

यह वास्तव में बॉक्सिंग के बारे में नहीं है, यह GetType के व्यवहार के बारे में है। यह चर के मूल्य के प्रकार देता है, प्रकार नहीं चर था साथ की घोषणा की:

object var4 = new List<string>(); 
    Console.WriteLine(var4.GetType().ToString()); 

System.Object या तो नहीं लौटेगा।

+0

यह संदर्भ के प्रकार को नहीं देगा, संदर्भ के प्रकार नहीं –

1

परिवर्तनीय की घोषणा केवल समय की जानकारी संकलित है जबकि विधि निष्पादन रनटाइम है।दूसरे शब्दों में गेटटाइप() को पता नहीं चल सकता कि ऑब्जेक्ट किस प्रकार घोषित किया गया था क्योंकि यह केवल रनटाइम पर ऑब्जेक्ट के वास्तविक प्रकार को ही जान सकता है।

समान अगर आप bInstance.GetType को

class a 
{ 
} 

class b : a 

a bInstance = new b(); 
bInstance.GetType(); 

कॉल किया था() जानते हुए भी कि चर प्रकार के रूप में 'एक' घोषित किया गया था का कोई रास्ता नहीं है और मुझे नहीं लगता कि आप इसे वापस करने के लिए 'उम्मीद करते हैं एक 'इस मामले में या तो। हालांकि उपर्युक्त उदाहरण में ऑब्जेक्ट का मेरा संक्षेप है और बी सिस्टम के लिए है। INT32

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