2010-02-09 12 views
16

क) चर एक ही स्ट्रिंग वस्तु को इंगितचूंकि तार अपरिवर्तनीय हैं, समान स्ट्रिंग मान वाले वेरिएबल समान स्ट्रिंग ऑब्जेक्ट को इंगित करते हैं?

 string s = "value"; 
     string s1 = "value"; 

Do और एस 1 संदर्भ (मैं इस तथ्य यह है कि तार अपरिवर्तनीय हैं) की वजह से यह सोचते हैं रहा हूँ?

बी) मुझे एहसास ऑपरेटरों (==,> आदि) को स्ट्रिंग ऑब्जेक्ट्स के मानों की तुलना करने के लिए फिर से परिभाषित किया गया है, लेकिन यह वैसा ही है जब स्थिर तरीकों का उपयोग करके दो स्ट्रिंग की तुलना करते समय ऑब्जेक्ट। एक्वाल्स() और ऑब्जेक्ट। रेफरेंस एक्वाल्स ()?

thanx

+2

मैं कोई विशेषज्ञ नहीं हूं लेकिन स्ट्रिंग इंटर्नमेंट पर यह लिंक देखें। http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_intern_pool – ChaosPandion

+10

कुछ अतिरिक्त टिप्पणी के लिए इस पर मेरा आलेख भी देखें: http://blogs.msdn.com/ericlippert/archive/2009/09/ 28/स्ट्रिंग-इंटर्निंग-एंड-स्ट्रिंग-खाली.एएसपी –

+0

@ एरिक - ग्रेट रीड, लिंक पोस्ट करने के लिए धन्यवाद। – ChaosPandion

उत्तर

21

नहीं, एक ही मूल्य के साथ सभी तार समान ऑब्जेक्ट संदर्भ नहीं हैं।

कंपाइलर द्वारा उत्पन्न स्ट्रिंग सभी को आंतरिक किया जाएगा और एक ही संदर्भ होगा। रनटाइम पर उत्पन्न स्ट्रिंग्स डिफ़ॉल्ट रूप से इंटर्न नहीं होते हैं और अलग-अलग संदर्भ होंगे।

var s1 = "abc"; 
var s2 = "abc"; 
var s3 = String.Join("", new[] {"a", "b", "c"}); 
var s4 = string.Intern(s3); 
Console.WriteLine(ReferenceEquals(s1, s2)); // Returns True 
Console.WriteLine(ReferenceEquals(s1, s3)); // Returns False 
Console.WriteLine(s1 == s3); // Returns True 
Console.WriteLine(ReferenceEquals(s1, s4)); // Returns True 

नोट जहां एक स्ट्रिंग String.Intern(string) का उपयोग कर जो तब आप कुछ चेक, जो बहुत तेजी से है के लिए वस्तु समानता के बजाय स्ट्रिंग समानता का उपयोग करने की अनुमति देता है प्रशिक्षु होने के लिए मजबूर कर सकते हैं इसके बाद के संस्करण लाइन। एक उदाहरण जहां इसका उपयोग आमतौर पर किया जाता है, नाम तालिका के साथ जेनरेट किए गए एक्सएमएल सीरिएलाइज़र कोड के अंदर होता है।

+1

+1 स्पष्टीकरण के लिए कि रन-टाइम पर बनाए गए तारों को मैन्युअल रूप से प्रशिक्षित किया जाना चाहिए। – ChaosPandion

+0

var s4 = string.Intern (s3) जोड़ने के लिए उपयुक्त हो सकता है; कंसोल। राइटलाइन (संदर्भ एक्वाल्स (एस 1, एस 4)); // रिटर्न – Dolphin

+0

@ डॉल्फिन, अच्छा बिंदु, मैंने जवाब अपडेट किया। –

3

हाँ, इन, एक ही स्ट्रिंग को इंगित क्योंकि वे दोनों स्ट्रिंग शाब्दिक रूप में परिभाषित कर रहे हैं होगा। यदि आप प्रोग्रामिंग रूप से एक स्ट्रिंग बनाते हैं, तो आपको स्ट्रिंग को मैन्युअल रूप से प्रशिक्षित करना होगा।

ऐसा इसलिए है क्योंकि .NET Framework आपके प्रोग्राम में स्ट्रिंग अक्षर को इंटर्न पूल में प्रशिक्षित करता है। आप इस संदर्भ को पुनर्प्राप्त करने के लिए String.Intern का उपयोग कर सकते हैं, या अपने स्वयं के रनटाइम-जेनरेट स्ट्रिंग को मैन्युअल रूप से प्रशिक्षित कर सकते हैं।

अधिक जानकारी के लिए docs for Intern का संदर्भ लें:

नतीजतन, एक विशेष मूल्य के साथ एक शाब्दिक स्ट्रिंग का एक उदाहरण ही व्यवस्था में एक बार से मौजूद है।

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

+2

हालांकि, यह कार्यान्वयन द्वारा, विनिर्देशन द्वारा नहीं है। –

+0

सच है - लेकिन कार्यान्वयन यह है, वर्तमान में, शाब्दिक मूल्यों के लिए। –

+0

मैंने अपने उत्तर में कुछ स्पष्टीकरण जोड़ा। –

2

करने के लिए इसे प्रदान करती है वर्तमान CLR समान शाब्दिक के साथ तार एक ही वास्तविक वस्तुओं को इंगित करते हैं। प्रक्रिया को इंटर्निंग कहा जाता है और सभी संकलन समय स्ट्रिंग पर लागू होता है।

रनटाइम पर बनाए गए तार डिफ़ॉल्ट रूप से इंटर्न नहीं होते हैं, लेकिन string.Intern पर कॉल करके आंतरिक संग्रह में जोड़ा जा सकता है।

कृपया .NET तारों को संग्रहीत करने के तरीके के विस्तृत विवरण के लिए my answer for this question देखें।

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