2012-01-11 33 views
7

संदर्भ प्रकार और मूल्य प्रकारों के बीच अंतर अक्सर शुरुआती लोगों के लिए भ्रमित होता है क्योंकि यह समझने के कारण कि वास्तव में मूल्य प्रकार का चर क्या है। हम जानते हैं कि:संदर्भ प्रकार - क्या हम वास्तविक संदर्भ देख सकते हैं?

  • मूल्य प्रकार वास्तविक मूल्य
  • संदर्भ प्रकार की दुकान केवल वस्तु

को संदर्भ की दुकान यह चर के प्रत्येक प्रकार के निरीक्षण करने के लिए या तो देखने के लिए संभव है मान, या वास्तविक संदर्भ स्वयं? क्या संदर्भ किसी प्रकार के कोड किए गए मान के रूप में संग्रहीत है? मुझे पता है कि संदर्भ मूल्य से पारित किया जा सकता है इसलिए मैं ऐसा मान रहा हूं।

मुझे लगता है कि यह नवागंतुकों को उनकी समझ के साथ मदद करेगा, और अन्वेषण करने में बहुत दिलचस्प होगा।

+1

केवल एक चीज जो आप देखेंगे वह एक पता है, जो एक यादृच्छिक यादृच्छिक संख्या है। आप इसे क्यों देखना चाहते हैं? – Dykam

+3

इस विचार को सीमेंट करने के लिए कि वेरिएबल के भीतर वे ऑब्जेक्ट सेट नहीं करते हैं, बल्कि एक पता है। हम इसका उपयोग कैसे करेंगे? –

+1

http://stackoverflow.com/questions/1978232/how-can-i-display-the-actual-value-of-a-reference-in-c-sharp –

उत्तर

10

क्या प्रत्येक प्रकार के चर का निरीक्षण मूल्य या वास्तविक संदर्भ को देखने के लिए संभव है?

बस स्पष्ट करने के लिए, संदर्भ प्रकारके चर के मूल्य एक संदर्भ है। संदर्भ मूल्य है।

एक संदर्भ एक प्रकार का मूल्य है, जैसे एक int एक प्रकार का मूल्य है। एक int के विपरीत, एक संदर्भ एक मान है जो केवल कॉपी किया जा सकता है और dereferenced; आप सीधे सी # में अपना मान नहीं देख सकते हैं, क्योंकि इसका मूल्य कचरा कलेक्टर का कार्यान्वयन विवरण है।

क्या संदर्भ किसी प्रकार के कोड किए गए मान के रूप में संग्रहीत है?

हाँ, बिल्कुल। प्रैक्टिस में, एक संदर्भ 32 या 64 बिट पूर्णांक है (इस पर निर्भर करता है कि आप 32 या 64 बिट प्रक्रिया में हैं या नहीं) जो कचरा कलेक्टर को ज्ञात कुछ संरचना के लिए एक सूचक है जिसे संदर्भित वस्तु के डेटा से जोड़ा जा रहा है ।

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

+3

मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि मौजूदा .NET कार्यान्वयन संदर्भ चर में पते (ऑब्जेक्ट-जानकारी रिकॉर्ड के) स्टोर कर सकते हैं, इस बात की कोई गारंटी नहीं है कि भविष्य के संस्करण ऐसा करेंगे। उदाहरण के लिए, यह संभव होगा कि संदर्भ चर के कुछ बिट्स एक सूचकांक होंगे जो कई ढेर में से एक का चयन करते हैं, जबकि अन्य बिट्स उस ढेर के भीतर एक सूचकांक थे। हालांकि ऐसी प्रणाली मौजूदा प्रोसेसर के साथ अक्षम हो सकती है, ऐसे मॉडल के आसपास भविष्य के प्रोसेसर डिजाइन करने से अधिक कुशल कैश उपयोग की अनुमति मिल सकती है। मौजूदा .NET कोड को ऐसे विवरणों की परवाह नहीं करनी चाहिए। – supercat

+0

@supercat: बिल्कुल। असल में संदर्भ पूरी तरह से अपारदर्शी हैंडल के रूप में लागू किए जा सकते हैं जो कचरा कलेक्टर के स्वामित्व वाली कुछ तालिका में इंडेक्स के रूप में केवल सार्थक हैं; कोई कारण नहीं है कि संदर्भ में किसी भी * बिट को एक विशेष अर्थ होना चाहिए। जैसा भी होता है, आज के कार्यान्वयन में संदर्भ के हर बिट * अर्थपूर्ण है क्योंकि इसे पॉइंटर के रूप में व्याख्या किया जा सकता है। लेकिन यह किसी भी समय परिवर्तन के अधीन है। –

+0

जिज्ञासा से, जबकि मौजूदा सीपीयू शायद ऐसी चीजों को बहुत कुशल होने की अनुमति नहीं देगा, मुझे आश्चर्य है कि भविष्य में सीपीयू में ऑब्जेक्ट्स के लिए एक छोटे-ऑब्जेक्ट ढेर के लिए उपयुक्त होगा, जिसका डेटा 8 (शायद 16) बाइट्स या उससे कम है , जहां ऑब्जेक्ट टेबल में प्रत्येक स्लॉट उस पर पॉइंटर के बजाय वास्तविक ऑब्जेक्ट डेटा रखेगा। मौजूदा सीपीयू पर, किसी भी दिए गए संदर्भ से संबंधित ढेर को निर्धारित करने के लिए प्रत्येक ढेर पहुंच के लिए अतिरिक्त निर्देशों की आवश्यकता होगी, लेकिन यदि कोई "ऑब्जेक्ट एड्रेस" निर्देश था जो एकल या डबल इंडिकेशन का चयन करने के संदर्भ में थोड़ा सा उपयोग करता था ... – supercat

1

आप इसे आसानी से पिन किए गए ऑब्जेक्ट के साथ कर सकते हैं;

GCHandle gch=GCHandle.Alloc(data, GCHandleType.Pinned); 
IntPtr AddressInMemory=gch.AddrOfPinnedObject(); 
+0

यह लगभग सभी वर्गों की तरह [गैर-blittable प्रकार] (http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx) के लिए काम नहीं करेगा। – svick

+0

मैं सही खड़ा हूँ। ऐसा लगता है कि मुझे केवल एक बार समय की आवश्यकता थी, यह प्राइमेटिव्स के साथ था। –

1

आप unsafe कोड के साथ कर सकते हैं:

unsafe 
    static void Main(string[] args) 
    { 
     string s = "Hello"; 

     fixed (char* pc = s) 
     {     
      IntPtr p = (IntPtr)pc; 
      Console.WriteLine(p); // here is your meaningless address 
     }    
    } 
+0

यह एस की पिन की प्रति बनाता है, तो आप सीधे पिन क्यों नहीं करते? –

+0

हम किसी भी चीज़ के लिए 's' का उपयोग नहीं करेंगे। –

+0

@EugenRieck क्या आपके पास उस कथन का स्रोत है? मुझे यहां कोई प्रतिलिपि नहीं दिख रही है। – CodesInChaos

5

यह शायद जॉन स्कीट के लिए है, लेकिन मैं इस पर एक अलग कोण हो सकता है:

चिंता मत करोके बारे में बहुत अधिक इन चीजों को स्मृति में दर्शाया गया है। जब तक आप पूरी भाषा विनिर्देश के माध्यम से पढ़ नहीं लेते हैं - वैसे भी यह कौन करता है? - आपको वास्तव में जानने की ज़रूरत नहीं है। वास्तव में। याद रखें कि कौन सा डेटा संग्रहीत किया जाता है - संभावना है कि यह कार्यान्वयन विशिष्ट है।

इसके बजाय, अर्थशास्त्र के संदर्भ में सोचें, उदा। कि एक फ़ंक्शन को पास किया गया मान मान कॉपी किया गया, जबकि संदर्भ प्रकार संदर्भित है। इस तरह के सामान।

आप वास्तव में यह जानना नहीं चाहते कि वास्तव में किसी प्रकार की घोषणा क्या है। मुझ पर विश्वास करो। आप क्या जानना चाहते हैं, यह से कैसे व्यवहार करता है।

+2

+1 यहां एरिक लिपर्ट [कहता है] (http://blogs.msdn.com/b/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx) वही बात है।पते एक कार्यान्वयन विस्तार हैं, संदर्भ निर्दिष्ट करते समय भाषा विनिर्देश पते का उल्लेख नहीं करता है। जानें कि वे कैसे व्यवहार करते हैं और नहीं कि वे कैसे काम करते हैं। – MarkJ

+2

जबकि मैं आपके बयान से सहमत हूं, मुझे नहीं लगता कि यह प्रश्न के बिंदु पर काफी है। मुझे लगता है कि वह यह जानना चाहता है कि यह कैसे करना है - यह नहीं कि आपकी राय क्यों महत्वपूर्ण नहीं है। यह समझना कि जटिल कार्यक्षमता कार्य आपको बेहतर इंजीनियर बना सकता है भले ही आपको उस ज्ञान के लिए त्वरित उपयोग न मिल जाए। –

+0

जबकि मैं दोनों आपके उत्तर के साथ धन्यवाद और सहमत हूं, यह मेरे प्रश्न के बिंदु को संबोधित नहीं करता है। मैं केवल यह सुनिश्चित करने के लिए पते ** तक पहुंचना चाहता हूं ** कोई अन्य कारण नहीं है। मैं @ AdamG.Carstensen से सहमत हूं। –

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