मुझे ऑब्जेक्ट आईडी रखने के रूप में संदर्भ प्रकारों के बारे में सोचना सबसे सहायक लगता है। यदि किसी के पास वर्ग प्रकार का एक चर है Car
, तो बयान myCar = new Car();
प्रणाली को एक नई कार बनाने और उसकी आईडी की रिपोर्ट करने के लिए कहता है (मान लें कि यह ऑब्जेक्ट # 57 है); यह तब चर में "ऑब्जेक्ट # 57" डालता है myCar
। अगर कोई लिखता है Car2 = myCar;
, तो वह "ऑब्जेक्ट # 57" वेरिएबल Car2 में लिखता है। अगर कोई लिखता हैcar2.Color = blue;
, जो सिस्टम को कार 2 (जैसे ऑब्जेक्ट # 57) द्वारा पहचानी गई कार को खोजने और नीले रंग में पेंट करने का निर्देश देता है।
केवल ऐसे ऑपरेशन जो ऑब्जेक्ट आईडी पर सीधे किए जाते हैं वे एक नई वस्तु का निर्माण करते हैं और आईडी प्राप्त करते हैं, एक "रिक्त" आईडी (यानी शून्य) प्राप्त करते हुए, एक वस्तु आईडी को एक चर या भंडारण स्थान पर कॉपी करते हैं जो इसे पकड़ सकता है, चाहे दो ऑब्जेक्ट आईडी मैच (एक ही वस्तु को देखें)। अन्य सभी अनुरोध सिस्टम को आईडी द्वारा संदर्भित वस्तु को खोजने के लिए कहते हैं और उस वस्तु पर कार्य करते हैं (बिना वैरिएबल या अन्य संस्था को प्रभावित किए हुए जो आईडी के पास है)।
.NET के मौजूदा कार्यान्वयन में, ऑब्जेक्ट चर एक कचरा एकत्र ढेर पर संग्रहीत ऑब्जेक्ट के लिए पॉइंटर्स रखने की संभावना रखते हैं, लेकिन यह एक अनपेक्षित कार्यान्वयन विवरण है क्योंकि ऑब्जेक्ट संदर्भ और किसी अन्य प्रकार के पॉइंटर के बीच एक महत्वपूर्ण अंतर है। एक पॉइंटर को आम तौर पर किसी चीज़ के स्थान का प्रतिनिधित्व करने के लिए ग्रहण किया जाता है, जिसके साथ काम करने के लिए लंबे समय तक रखा जाएगा। वस्तु संदर्भ नहीं। कोड का एक टुकड़ा पता 0x12345678 पर स्थित ऑब्जेक्ट के संदर्भ में SI रजिस्टर लोड कर सकता है, इसका उपयोग करना शुरू कर सकता है, और फिर बाधित हो सकता है जबकि कचरा कलेक्टर ऑब्जेक्ट को 0x23456789 पर ले जाता है। यह एक आपदा की तरह लग रहा होगा, लेकिन कचरा कोड के साथ जुड़े मेटाडेटा की जांच करेगा, निरीक्षण करेगा कि कोड एसआई का उपयोग उस वस्तु का पता रखने के लिए करता था जिसका वह उपयोग कर रहा था (यानी 0x12345678), उस ऑब्जेक्ट को निर्धारित करें जो 0x12345678 पर था, 0x23456789 पर ले जाया गया था, और एसआई को 0x23456789 पर वापस जाने से पहले अपडेट करने के लिए अपडेट करें। ध्यान दें कि उस परिदृश्य में, SI में संग्रहीत संख्यात्मक मान को कचरा संग्राहक द्वारा बदल दिया गया था, लेकिन इसे संदर्भित किया गया थाइस कदम से पहले और बाद में एक ही वस्तु । यदि इस कदम से पहले यह कार्यक्रम स्टार्टअप के बाद से बनाई गई 23,592 वीं वस्तु को संदर्भित करता है, तो यह आगे भी ऐसा करता रहेगा। दिलचस्प बात यह है कि .NET अधिकांश वस्तुओं के लिए कोई अद्वितीय और अपरिवर्तनीय पहचानकर्ता संग्रहीत नहीं करता है; किसी प्रोग्राम की मेमोरी के दो स्नैपशॉट दिए जाने पर, यह बताना हमेशा संभव नहीं होगा कि पहले स्नैपशॉट में कोई विशेष वस्तु दूसरे में मौजूद है, या यदि इसके लिए सभी निशान छोड़ दिए गए हैं और एक नया ऑब्जेक्ट बनाया गया है जो ऐसा दिखता है सभी अवलोकन योग्य विवरण।