2012-03-23 14 views
5

मुझे पता है कि मेरा प्रश्न गूंगा लगता है लेकिन मैं उलझन में हूं। अगर कोई मेरे लिए यह स्पष्ट करता है तो मैं सराहना करता हूं।सिस्टम के बीच संबंध। ऑब्जेक्ट क्लास और स्ट्रक्चर

मुझे पता है कि structs, उदा। Int32, मूल्य प्रकार हैं और स्टैक पर तत्काल होते हैं जबकि कक्षा संदर्भ प्रकार होते हैं और ढेर पर तत्काल होते हैं। मुझे यह भी पता है कि सभी structs System.Object प्रकार से प्राप्त किए गए हैं, जो एक वर्ग है। मुझे आश्चर्य है कि यह कैसे संभव है कि supertype, System.Object, एक संदर्भ प्रकार है और उप प्रकार, Int32, एक मान प्रकार है? मुझे यह समझने के लिए कहां जाना चाहिए कि यह कैसे काम करता है?

+7

संबंधित पढ़ने: [ढेर एक कार्यान्वयन विस्तार है] (http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation -detail.aspx) – Heinzi

+2

http://stackoverflow.com/questions/1682231/how-do-valuetypes-derive-from-object-referencetype-and-still-be-valuetypes – daryal

+0

का संभावित डुप्लिकेट यह संकलक –

उत्तर

11

मुझे पता है कि structs, उदा। Int32, मूल्य प्रकार हैं और स्टैक पर तत्काल होते हैं जबकि कक्षा संदर्भ प्रकार होते हैं और ढेर पर तत्काल होते हैं।

आपको लगता है कि पता नहीं है, क्योंकि क्रम में ज्ञान रूप में वर्गीकृत करने एक विश्वास सच होना चाहिए। यह विश्वास निश्चित रूप से सच नहीं है, हालांकि कई लोग इसे मानते हैं।

मूल्य प्रकार कभी-कभी स्टैक पर आवंटित किए जाते हैं। संदर्भ कभी-कभी स्टैक पर आवंटित किए जाते हैं और ढेर पर आवंटित स्मृति का संदर्भ लें। मूल्य प्रकार कभी-कभी ढेर पर आवंटित होते हैं। (और निश्चित रूप से मूल्य प्रकार और संदर्भ भी रजिस्टरों जो न तो ढेर है और न ही ढेर कर रहे हैं में आवंटित किया जा सकता है।)

क्या निर्धारित करता है क्या भंडारण ढेर पर आवंटित किया जाता है और क्या ढेर पर आवंटित किया जाता है में जाना जाता है जीवन की आवश्यकताओं है भंडारण, किस प्रकार की बात है। यदि एक चर को अल्पकालिक माना जाता है तो इसे ढेर पर आवंटित किया जा सकता है; यदि यह अल्पकालिक होने के लिए ज्ञात नहीं है तो इसे ढेर पर आवंटित किया जाना चाहिए।

मुझे यह भी पता है कि सभी structs System.Object प्रकार से प्राप्त किए गए हैं, जो एक वर्ग है। मुझे आश्चर्य है कि यह कैसे संभव है कि supertype, System.Object, एक संदर्भ प्रकार है और उप प्रकार, Int32, एक मान प्रकार है?

मुझे संदेह है कि आपको यह समझ में नहीं आता कि "विरासत से" क्या मतलब है यदि यह आपको भ्रमित कर रहा है। जब हम कहते हैं कि System.Int32, एक मान प्रकार, सिस्टम से प्राप्त होता है। ऑब्जेक्ट, एक संदर्भ प्रकार, हमारा मतलब है कि ऑब्जेक्ट के सभी सदस्य Int32 के सदस्य भी हैं। ऑब्जेक्ट में "ToString" विधि है। वह ऑब्जेक्ट का सदस्य है। इसलिए Int32 में "ToString" विधि भी है, क्योंकि Int32 ऑब्जेक्ट से प्राप्त होता है।

है कि विरासत का अर्थ है। मुझे संदेह है कि आप मानते हैं कि विरासत का मतलब कुछ और है, और जो कुछ भी "कुछ" संदर्भ प्रकारों को विस्तारित करने से मूल्य प्रकारों को रोकता है। आपके पास जो भी विश्वास है जो आपको लगता है कि मान प्रकार संदर्भ प्रकारों से प्राप्त नहीं हो सकते हैं स्पष्ट रूप से झूठी है, क्योंकि जाहिर है कि वे करते हैं।

मुझे यह जानने में दिलचस्पी है कि लोग प्रोग्रामिंग भाषाओं के बारे में क्या झूठी बातें मानते हैं; यह क्या है कि आपको लगता है कि विरासत संबंधों के बारे में गलत है जो मूल्य प्रकारों को संदर्भ प्रकारों से प्राप्त करने से रोक देगा?

आप पढ़ सकते हैं और ये सभी लेख को समझना चाहिए:

http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

http://blogs.msdn.com/b/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

http://ericlippert.com/2011/09/19/inheritance-and-representation/

और अतिरिक्त बोनस, यह एक भी आप के लिए उपयोगी हो सकता है :

http://blogs.msdn.com/b/ericlippert/archive/2012/01/16/what-is-the-defining-characteristic-of-a-local-variable.aspx

+5

मैं ओपी नहीं हूं, लेकिन मुझे लगता है कि विरासत में एक आम धारणा है इस तरह: यदि आप 'व्युत्पन्न' प्रकार का ऑब्जेक्ट बनाते हैं, तो आपको 'अवधारणात्मक रूप से)' बेस 'प्रकार का ऑब्जेक्ट बनाना होगा, जिसे तब तक "व्युत्पन्न" किया जाता है जब तक कि आपने' व्युत्पन्न ' (आखिरकार, हम श्रृंखला में हर आधार कन्स्ट्रक्टर को बुला रहे हैं)। इसलिए, 'Int32' बनाने के लिए आपको' ऑब्जेक्ट 'और इस प्रकार एक संदर्भ प्रकार बनाना होगा। –

+0

धन्यवाद एरिक। मैं ठीक तरह सोच रहा था कि माइकल ने क्या कहा और यह मेरे लिए किसी तरह अजीब था। – Morteza

+3

@ माइकलस्टम: मुख्य शब्द "अवधारणात्मक" है - वास्तव में, एक int * अवधारणात्मक * का निर्माण एक वस्तु का पहला निर्माण है। लेकिन * अभ्यास में * ऐसा नहीं है * वास्तव में * होता है क्योंकि सिस्टम सावधानीपूर्वक स्थापित किया गया है ताकि इसे * होने की आवश्यकता न हो। –

2

सबसे पहले, मूल्य प्रकारों की विशिष्ट विशेषता वह जगह नहीं है जहां वे संग्रहीत हैं लेकिन वे विधियों को कैसे पारित कर रहे हैं। संरचना मूल्य से गुजरती है; यह तर्क की एक प्रति बनाई गई है और पास की गई है। विधि के भीतर प्रतिलिपि में कोई भी परिवर्तन वास्तविक तर्क को प्रभावित नहीं करता है (जब तक वे एक ही संदर्भ साझा नहीं करते हैं) संदर्भ प्रकार संदर्भ द्वारा पारित किए जाते हैं; यह वास्तविक तर्क के लिए एक सूचक है पारित किया गया है।

हां, structs ValueType से व्युत्पन्न होते हैं। और ValueTypeObject से लिया गया है। इसलिए, अंत में structs Object से भी व्युत्पन्न होते हैं। (उदाहरण के लिए, तरीकों ToString(), ==, Equals(), GetHashCode() और शायद कुछ अन्य लोगों Object में परिभाषित कर रहे हैं और इसलिए भी struct में उपलब्ध)

हालांकि, तर्क पासिंग की अर्थ विज्ञान कक्षाएं में परिभाषित नहीं कर रहे हैं खुद को; Object की परिभाषा के भीतर कोई कोड नहीं है जो कहता है "मेरे उपप्रकारों के किसी भी उदाहरण संदर्भ द्वारा पारित किया जाना है" और ValueType की परिभाषा के भीतर कोई कोड नहीं है जो कहता है "मेरे उपप्रकारों के किसी भी उदाहरण को मूल्य से पारित किया जाना है"। [शायद एक विशेष विशेषता है लेकिन यह गिनती नहीं है] यह सम्मान करने के लिए संकलक की ज़िम्मेदारी है। (सी # कंपाइलर्स के भीतर कहीं कुछ कोड है जो कहता है "कोड उत्पन्न करें जैसे वैल्यू टाइप के वंशज मूल्य से पारित किए जाएंगे और अन्य संदर्भ द्वारा पारित किए जाएंगे")

एरिक लिपर्ट का ब्लॉग सी # के बारे में कई मुद्दों पर एक शानदार संसाधन है, और आपको लिंक @Heinzi को और स्पष्टीकरण के लिए दिया जाना चाहिए।

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