2011-04-18 18 views
6

'मुझे यह जानने की ज़रूरत है कि कार्यक्रम के पूरी तरह से अलग हिस्सों से दो संदर्भ एक ही वस्तु को संदर्भित करते हैं या नहीं। मैं संदर्भ प्रोग्रामेटिकल की तुलना नहीं कर सकता क्योंकि वे अलग-अलग संदर्भ से हैं (एक संदर्भ दूसरे से दिखाई नहीं देता है और इसके विपरीत)।ऑब्जेक्ट आईडी कैसे मुद्रित करें?

फिर मैं Console.WriteLine() का उपयोग करके प्रत्येक ऑब्जेक्ट के लिए अद्वितीय पहचानकर्ता मुद्रित करना चाहता हूं। लेकिन ToString() विधि "अद्वितीय" पहचानकर्ता नहीं लौटाती है, यह सिर्फ "वर्गनाम" लौटाती है।

क्या सी # (जावा में की तरह) में अद्वितीय पहचानकर्ता मुद्रित करना संभव है?

+1

क्या आप एक उपयोग केस दे सकते हैं जहां यह समझ में आता है? उनके संदर्भों के बिना वस्तुओं की तुलना करने की कोशिश करना व्यर्थ है। – Tejs

उत्तर

16

निकटतम आप आसानी से प्राप्त कर सकते हैं (जो आसपास के जीसी चलती वस्तुओं से प्रभावित नहीं होंगे) शायद RuntimeHelpers.GetHashCode(Object) है। यह हैश कोड देता है जो ऑब्जेक्ट पर Object.GetHashCode() पर कॉल करके वापस लौटाया जाएगा। यह अभी भी हालांकि एक अद्वितीय पहचानकर्ता है। यह संभवतः नैदानिक ​​उद्देश्यों के लिए पर्याप्त है, लेकिन आपको उत्पादन तुलना के लिए इस पर भरोसा नहीं करना चाहिए।

संपादित करें: यदि यह केवल डायग्नोस्टिक्स के लिए है, तो आप एक प्रकार का "कैनोलिकलाइजिंग आईडी जनरेटर" जोड़ सकते हैं जो कि केवल List<object> था ... जब आप किसी ऑब्जेक्ट की "आईडी" मांगते हैं तो आप जांच करेंगे कि यह पहले से मौजूद है या नहीं सूची (संदर्भों की तुलना करके) और फिर इसे अंत में जोड़ें यदि यह नहीं हुआ। आईडी सूची में सूचकांक होगा। बेशक, मेमोरी लीक शुरू किए बिना ऐसा करना कमजोर संदर्भ आदि शामिल होगा, लेकिन एक साधारण हैक के रूप में यह आपके लिए काम कर सकता है।

+0

क्या ब्लिंडी का जवाब सही नहीं है? क्या यह पूरा सवाल नहीं है? –

+0

@Adam: ब्लिंडी के उत्तर पर मेरी टिप्पणी देखें। केवल प्रश्न के आधार पर अनुमान लगाया जाता है, लेकिन यह निश्चित मात्रा में समझ में आता है। –

+0

अहह - यह समझ में आता है। धन्यवाद जॉन –

2

एक संदर्भ दूसरे से दिखाई नहीं देता है और इसके विपरीत

मुझे लगता है कि नहीं खरीदते हैं। यदि आप हैंडल भी प्राप्त नहीं कर पा रहे हैं, तो आप उनकी आईडी कैसे प्राप्त करेंगे?

सी # में आप हमेशा ऑब्जेक्ट्स को हैंडल प्राप्त कर सकते हैं, और आप हमेशा उनकी तुलना कर सकते हैं। भले ही आपको इसे करने के लिए प्रतिबिंब का उपयोग करना पड़े।

+1

मुझे संदेह है कि आप गायब हैं कि ओपी किसी समस्या का निदान करने का प्रयास कर रहा है ... कुछ बिंदुओं पर किसी विवरण के ऑब्जेक्ट संदर्भ को प्रिंट करना, और फिर एक और प्रिंट करना, फिर उन्हें दृष्टि से तुलना करना। उस प्रक्रिया में किसी भी समय कोड के किसी भी टुकड़े के साथ दोनों संदर्भों तक पहुंच नहीं है। वैसे भी, मेरा अनुमान है। –

+0

@ जोन, वह हमेशा उन्हें "वैश्विक" सूची में जोड़ सकता है और समय-समय पर 'ऑब्जेक्ट' के साथ सूची सामग्री का निरीक्षण कर सकता है। अगर वह उसका इरादा है। मैं स्वीकार करूंगा कि मैंने अपनी समस्या के किसी भी व्यावहारिक अनुप्रयोग के बारे में सोचा नहीं था <। < – Blindy

+0

युप - यही मेरा संपादन मूल रूप से सुझाव दे रहा था :) –

0

मुझे लगता है कि आप अपने object संदर्भ पर ToString पर कॉल कर रहे हैं, लेकिन इस या आपके समझाया गया स्थिति पूरी तरह से स्पष्ट नहीं है, टीबीएच, तो बस मेरे साथ सहन करें।

क्या इस प्रकार ID संपत्ति का खुलासा करता है? यदि हां, तो इस कोशिश:

var idAsString = yourObjectInstance.ID.ToString(); 

या, सीधे प्रिंट:

Console.WriteLine(yourObjectInstance.ID); 

संपादित करें:

मैं जॉन को देखने का अधिकार इस समस्या के माध्यम से देखा है, और मेरा उत्तर देखो बनाता है बल्कि बेवकूफ - परवाह किए बिना, मैं इसे छोड़ रहा हूं अगर किसी और चीज के लिए लेकिन प्रश्न की स्पष्टता की कमी पर जोर देने के लिए। और, शायद, जॉन के बयान के आधार पर नीचे जाने का एक तरीका प्रदान करें कि 'यह [GetHashCode] अभी भी एक अद्वितीय पहचानकर्ता नहीं है', क्या आप पहचानकर्ता के माध्यम से अपनी विशिष्टता का खुलासा करने का निर्णय लेना चाहिए।

1

यदि आपको पता होना चाहिए कि दो संदर्भ एक ही वस्तु को इंगित कर रहे हैं, तो मैं केवल this का पालन करूंगा।

डिफ़ॉल्ट रूप से, ऑपरेटर == संदर्भ समानता के लिए परीक्षण करता है। यह द्वारा निर्धारित किया जाता है कि यह निर्धारित करता है कि दो संदर्भ एक ही ऑब्जेक्ट को इंगित करते हैं। इसलिए प्रकार ऑपरेटर == को कार्यक्षमता प्राप्त करने के लिए लागू करने की आवश्यकता नहीं है।

तो, == ऑपरेटर आईडी वर्कअराउंड किए बिना चाल करेगा।

+2

"मैं संदर्भ प्रोग्रामेटिकल की तुलना नहीं कर सकता" –

+0

फिर मेरा जवाब है "नहीं यह संभव नहीं है "जब तक कि आप एक कस्टम आईडी बनाते हैं और उन की तुलना नहीं करते हैं। या GetHashCode() वर्कअराउंड करें जो आपने वहां बताया था। – apacay

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