2012-02-02 15 views
7

इस स्थिति में क्यों ReferenceEquals ऑब्जेक्ट की विधि अलग-अलग व्यवहार करती है?संदर्भ के साथ गलत काम कर रहे हैं

string a= "fg"; 
string b= "fg"; 
Console.WriteLine(object.ReferenceEquals(a, b)); 

तो इस स्थिति में यह एक परिणाम true मिलता है। मामले में, यह मेरे तारों के मूल्यों की तुलना करता है और संदर्भ नहीं। लेकिन जब मैं की तरह कुछ लिखें:

StringBuilder c = new StringBuilder("fg"); 
string d = c.ToString(); 
Console.WriteLine(object.ReferenceEquals(a, d)); 

इस मामले में यह ठीक काम करता है और परिणाम false है, क्योंकि यह मेरी वस्तुओं की संदर्भ तुलना करती है।

+1

यहां तक ​​कि चक नॉरिस भी एसओ पर है। वाह! – RBT

उत्तर

13

पहले उदाहरण में एक संकलन समय निरंतर "fg" है जिसे दो चर द्वारा संदर्भित किया गया है। चूंकि यह संकलन समय स्थिर है, इसलिए दो चर एक वस्तु का संदर्भ देते हैं। संदर्भ बराबर हैं।

इस व्यवहार पर स्ट्रिंग इंटर्निंग के विषय में पढ़ें। एक स्टार्टर के रूप में, पर विचार करें:

उदाहरण के लिए, यदि कई घटकों के लिए एक ही शाब्दिक स्ट्रिंग असाइन करते हैं, क्रम प्रशिक्षु पूल से शाब्दिक स्ट्रिंग के लिए एक ही संदर्भ प्राप्त करता है और प्रत्येक चर करने के लिए इसे प्रदान करती है।

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

दूसरे उदाहरण में, केवल एक एक संकलन समय निरंतर, अन्य कुछ कार्यों का एक परिणाम है। a और d एक ही ऑब्जेक्ट का संदर्भ नहीं देते हैं, इसलिए आपको ReferenceEquals से झूठा परिणाम मिलता है।

+0

@ हेनक, मुझे यकीन नहीं है कि आप कहां जा रहे हैं, हालांकि मैं मानता हूं कि मैं अवधारणा से पूरी तरह से परिचित नहीं हूं। मेरा पठन बस इतना है कि फोल्डिंग एक शाब्दिक अभिव्यक्ति है, कहें, "एफ" + "जी" 'को कंपाइलर द्वारा '' fg '' में परिवर्तित कर दिया जाएगा। हालांकि, कोड 'स्ट्रिंग ए = "एफजी" में; स्ट्रिंग बी = "एफजी"; ', आप उत्सर्जित आईएल 'IL_0000: ldstr" fg "/ IL_0005: stloc.0/IL_0006: ldstr" fg "/ IL_000B: stloc.1' –

+0

और वास्तव में, यदि आप में देखना चाहते हैं 'स्ट्रिंग सी = "एफ" + "जी" 'भी है, वही निर्देश" एफजी "लोड करने के लिए उत्सर्जित होता है। अपनी शिक्षा के लिए, ए और बी के लिए तह कहां है? –

2

यह दोनों मामलों में सही ढंग से व्यवहार कर रहा है।

कारण a और b रहे हैं, क्योंकि संकलक नोटिस किया है कि आप एक ही स्ट्रिंग दो बार निर्दिष्ट, और एक ही स्ट्रिंग वस्तु पुन: उपयोग किया गया है a और b दोनों प्रारंभ करने में एक ही स्ट्रिंग वस्तु है।

यह आम तौर पर आपके आवेदन में प्रत्येक स्ट्रिंग स्थिरांक के साथ होता है।

0

चूंकि आप एक ही शाब्दिक ("एफजी") का संदर्भ देते हैं, तो आपके तार वास्तव में एक ही चीज़ पर इंगित करेंगे। कृपया इस आलेख पर एक नज़र डालें: http://csharpindepth.com/Articles/General/Strings.aspx (अनुच्छेद "आंतरिक")।

सादर, पायोत्र

0

इस post यह कुछ होना शामिल कहा जाता है के साथ क्या करना है के अनुसार। ए और बी आपके मामले में दो चर हैं जो एक ही उदाहरण को इंगित करते हैं, यही कारण है कि संदर्भ एक्वाल्स सच हो रहा है।

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