2012-10-16 17 views
7

मुझे .NET में वैल्यू प्रकार का प्रतिनिधित्व समझने में समस्या है। प्रत्येक मान प्रकार System.ValueType क्लास से लिया गया है, तो क्या इसका मतलब यह है कि मान प्रकार एक वर्ग है?.NET में वैल्यू प्रकार वास्तव में कैसे काम करते हैं?

उदाहरण के लिए, अगर मैं लिखना:

int x = 5; 

इसका मतलब यह है कि मैं System.Int32 वर्ग का एक उदाहरण एक 'इसे में चर x लिखने बनाने ??

+1

[System.ValueType] (http://msdn.microsoft.com/ en-us/library/system.valuetype.aspx) – Oded

+2

_ सिस्टम से हटाया गया। ValueType class_ यह प्राप्त करने का एक विशेष रूप है, विरासत के समान नहीं। यह एफएक्स में बनाया गया है। –

+2

भविष्य के पाठकों के लिए: [** मूल्य प्रकार के बारे में सत्य **] (http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx) –

उत्तर

6

सिस्टम। वैल्यू टाइप क्लास वास्तव में सिर्फ "मेटा" वर्ग है, और आंतरिक रूप से सामान्य कक्षाओं से अलग तरीके से संभाला जाता है। स्ट्रक्चर और आदिम प्रकार सिस्टम का वारिस करते हैं। वैल्यू टाइप स्पष्ट रूप से, लेकिन वह प्रकार वास्तव में रनटाइम के दौरान मौजूद नहीं होता है, यह असेंबली के लिए यह एक तरीका है कि एक वर्ग को वैल्यू टाइप स्ट्रक्चर की तरह माना जाना चाहिए और पास-बाय-वैल्यू सेमेन्टिक्स लेना चाहिए।

अन्य उत्तरों के विपरीत, मूल्य प्रकार हमेशा ढेर पर आवंटित नहीं होते हैं। जब वे एक कक्षा में खेतों में होते हैं, तो वे उस वर्ग की शेष स्थिति की तरह ही ढेर पर बैठते हैं जब उस वस्तु को तुरंत चालू किया जाता है। इटरेटर्स या क्लोजर के अंदर उपयोग किए जाने पर स्थानीय चर को एक निहित वर्ग में भी घुमाया जा सकता है।

+0

आपको धन्यवाद, बहुत उपयोगी –

-1

मूल्य प्रकार कक्षाएं नहीं हैं। ये भाषाओं में अंतर्निहित प्रकार हैं और .NET CTS (सामान्य प्रकार प्रणाली) द्वारा नियंत्रित किए जाते हैं। सीटीएस सीएलआर के अंदर एक घटक है जो बूल, इंट, डबल, फ्लोट इत्यादि जैसे मूल्य प्रकारों को संभालने के लिए ज़िम्मेदार है जब आप मूल्य प्रकार का ऑब्जेक्ट बनाते हैं तो यह स्टैक पर बनाया जाता है। जब आप इसे फ़ंक्शन में पास करते हैं या फ़ंक्शन से वापस लौटते हैं तो राम में इसके लिए एक नई वस्तु बनाई जाती है। लेकिन संदर्भ प्रकारों के मामले में, केवल वस्तु का संदर्भ पारित किया जाता है और नई वस्तु इनम मेमोरी नहीं बनाई जाती है। कुछ उपयोगकर्ता परिभाषित मान प्रकार हैं जो भाषा विनिर्देश में नहीं हैं और उपयोगकर्ताओं द्वारा परिभाषित किए गए हैं। इस तरह के मूल्य प्रकार System.ValueType से विरासत में हैं। इस तरह के वैल्यूटाइप का उदाहरण जटिल संख्या है। हम System.ValueType का उपयोग कर अपने स्वयं के उपयोगकर्ता परिभाषित जटिल संख्या बना सकते हैं।

+0

मैं डाउनवोट नहीं जा रहा हूं क्योंकि यह एसओ पर आपका पहला दिन है, लेकिन कृपया अन्य उत्तर –

+1

की टिप्पणियां पढ़ें, क्योंकि यह गलत है क्योंकि मैं डाउनवोट करने जा रहा हूं। मूल्य प्रकारों के पूर्ण उपचार के लिए http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx देखें। –

+0

@ थॉमस्मिथ: हालांकि ढेर एक कार्यान्वयन विस्तार है, मौलिक बिंदु सही है: मूल्य-प्रकार भंडारण स्थान (कंपाइलर अस्थायी समेत) वर्ग वस्तुओं को नहीं पकड़ते हैं। सी # spec दावा कर सकता है कि 'Int32' फ़ील्ड की सामग्री 'System.Object' से प्राप्त होती है, लेकिन सीएलआई स्पेक (जो वर्णन करता है कि प्रबंधित कोड की दुनिया वास्तव में कैसे काम करती है) स्पष्ट करता है कि' System.Int32' दो प्रकारों का वर्णन करता है: एक ढेर-ऑब्जेक्ट प्रकार जो 'System.Object' और भंडारण-स्थान प्रकार से प्राप्त होता है जो ऑब्जेक्ट नहीं है। सी # spec अन्यथा नाटक कर सकता है, लेकिन यह सच नहीं है। – supercat

0

अब, इसके बारे में बात करने के लिए बहुत कुछ है। गंभीरता से, नेट पर इस विषय के बारे में सौ पृष्ठ हैं, और इसमें से अधिकांश मेरे मस्तिष्क पदार्थ को खतरनाक दर पर जलते हैं।

मुझे वास्तव में क्या याद आया, int और Int32 एक ही चीज़ है, और दोनों एक वर्ग की तरह एक संरचना की तरह कार्य करते हैं। Int32 के लिए शॉर्टकट होने के नाते "int"। (यदि आप एक पूर्णांक पर अपने माउस डालें, तो टूलटिप लिखा है "struct System.Int32" जिसका मतलब है:।।

public class BoxedInt 
{ 
    public int x; 

    public BoxedInt(int i) { x = i; } 
} 

public Test() 
{ 
    BoxedInt bi = new BoxedInt(10); 
    Boxed(bi); 
    Console.WriteLine(bi.x); // Returns 11, as any reference type would. 

    int vi = 10; 
    Valued(vi); 
    Console.WriteLine(vi); // Returns 10, because it acts like a struct. (Which it is) 
} 

public void Boxed(BoxedInt i) 
{ 
    i.x++; 
} 

public void Valued(int i) 
{ 
    i++; 
} 
+0

'सार्वजनिक शून्य मूल्य (ref int i)' 11 लौटाएगा, क्योंकि ...? – AgentFire

+0

बॉक्स किए गए रिटर्न 11, मूल्यवान रिटर्न 10. – LightStriker

+0

एक बॉक्स किए गए मान, या यदि आप चाहें, तो कक्षा के अंदर निहित मूल्य बॉक्स के अंदर होना जैसा है। यदि मैं आपको बताता हूं कि बॉक्स कहां मौजूद है और आप इसकी सामग्री बदलते हैं, तो मैं बॉक्स को चेक कर सकता हूं और देख सकता हूं कि आपने क्या परिवर्तन किया है। इसके लिए, कक्षा एक बॉक्स के रूप में कार्य करती है, और जब तक कोड संदर्भ में कहीं भी यह अस्तित्व में रहेगा। एक सामान्य मूल्य के रूप में, मैं आपको वह मूल्य बता सकता हूं लेकिन मैं आपको यह नहीं दे सकता। यदि आप तय करते हैं कि इसे बदलना चाहिए, तो मुझे यह जानने का कोई तरीका नहीं है कि जब तक आप मुझे स्पष्ट रूप से नहीं बताते। इसके लिए, "i" केवल मूल्यवान विधि की सीमाओं के भीतर मौजूद है और जैसे ही विधि पूरी हो जाती है, नष्ट हो जाती है। – LightStriker

1

देखें Eric Lippert's article

संक्षेप में, एक मान प्रकार मूल्य से कॉपी किया जाता है मान। प्रकार संदर्भ प्रकारों की तरह कक्षाएं हैं, और मूल्य प्रकारों के उदाहरण वस्तुएं हैं। 5 एक ऑब्जेक्ट है, System.Int32 (int संक्षिप्त के लिए एक उदाहरण)

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