स्ट्रिंगबिल्डर को वापस लौटें यदि आप स्ट्रिंग को और संशोधित करने जा रहे हैं, अन्यथा स्ट्रिंग को वापस करें। यह एक एपीआई सवाल है।
दक्षता के बारे में। चूंकि यह किसी भी विशिष्टता के बिना एक अस्पष्ट/सामान्य प्रश्न है, तो मुझे लगता है कि उत्परिवर्तनीय बनाम अपरिवर्तनीय प्रदर्शन से अधिक महत्वपूर्ण है। उत्परिवर्तन आपके एपीआई रिटर्न संशोधित वस्तुओं को देने का एक एपीआई मुद्दा है। स्ट्रिंग लंबाई इस के लिए अप्रासंगिक है।
ने कहा। आप परावर्तक साथ StringBuilder.ToString को देखें, तो:
public override string ToString()
{
string stringValue = this.m_StringValue;
if (this.m_currentThread != Thread.InternalGetCurrentThread())
{
return string.InternalCopy(stringValue);
}
if ((2 * stringValue.Length) < stringValue.ArrayLength)
{
return string.InternalCopy(stringValue);
}
stringValue.ClearPostNullChar();
this.m_currentThread = IntPtr.Zero;
return stringValue;
}
आप इसे एक प्रतिलिपि कर सकते हैं देख सकते हैं लेकिन यदि आप इसे StringBuilder साथ संशोधित तो यह तो एक प्रतिलिपि बनाने जाएगा (यह है कि मैं क्या की बात बता सकते हैं है m_current थ्रेड इसलिए है क्योंकि संलग्न करें इसे जांचें और अगर यह वर्तमान थ्रेड को मेल नहीं खाती है तो इसकी प्रतिलिपि बनाई जाएगी)।
मुझे लगता है कि इसका अंत यह है कि यदि आप स्ट्रिंगबिल्डर को संशोधित नहीं करते हैं तो आप स्ट्रिंग की प्रतिलिपि नहीं बनाते हैं और लंबाई दक्षता के लिए अप्रासंगिक है (जब तक कि आप उस दूसरे को हिट नहीं करते)।
अद्यतन
System.String है एक वर्ग है जो इसे एक संदर्भ प्रकार (मान प्रकार के रूप में विरोध किया) तो है का मतलब है "स्ट्रिंग foo," अनिवार्य रूप से एक सूचक है। (जब आप किसी विधि में एक स्ट्रिंग पास करते हैं तो यह पॉइंटर पास करता है, प्रतिलिपि नहीं।) सिस्टम। स्ट्रिंग mscorlib के अंदर उत्परिवर्तनीय है लेकिन इसके बाहर अपरिवर्तनीय है, इस प्रकार स्ट्रिंगबिल्डर एक स्ट्रिंग में हेरफेर कर सकता है।
तो जब ToString() कहा जाता है तो यह संदर्भ द्वारा अपनी आंतरिक स्ट्रिंग ऑब्जेक्ट देता है। इस बिंदु पर आप इसे संशोधित नहीं कर सकते क्योंकि आपका कोड mscorlib में नहीं है। M_current थ्रेड फ़ील्ड को शून्य पर सेट करके स्ट्रिंगबिल्डर पर कोई और ऑपरेशन स्ट्रिंग ऑब्जेक्ट की प्रतिलिपि बनाने का कारण बनता है, इसलिए इसे और संशोधित किया जा सकता है जो इसे ToString() में लौटाई गई स्ट्रिंग ऑब्जेक्ट को संशोधित नहीं करता है। इस पर विचार करें:
StringBuilder sb = new StringBuilder();
sb.Append("Hello ");
string foo = sb.ToString();
sb.Append("World");
string bar = sb.ToString();
StringBuilder अंत foo पर तो एक प्रति नहीं किया है तो हो सकता है "नमस्ते दुनिया" क्योंकि StringBuilder इसे संशोधित। लेकिन चूंकि उसने एक प्रतिलिपि बनाई है तो foo अभी भी "हैलो" है और बार "हैलो वर्ल्ड" है।
क्या यह पूरी वापसी/संदर्भ वस्तु को स्पष्ट करता है?
@ स्कीप्पीफायर दक्षता के बारे में पूछ रहा है। –
-1। यदि आप स्ट्रिंग को और संशोधित करने जा रहे हैं तो इसे विधि के भीतर और संशोधित किया जाना चाहिए। क्या होगा यदि इस विधि को एकाधिक स्थानों से कहा जाता है और स्ट्रिंग मैनिपुलेशन तर्क बदलता है? कई जगहों पर तर्क अपडेट करना अच्छा नहीं होगा –
निक, आप बाल बांट रहे हैं। यदि यह एक वर्ग और एक निजी विधि में है तो आप स्ट्रिंगबिल्डर को अंतिम स्ट्रिंग बनाने के लिए कई तरीकों से बहुत अच्छी तरह से पारित कर सकते हैं। आप वही काम कर सकते हैं जहां प्रत्येक विधि एक स्ट्रिंग देता है और उन्हें जोड़ता है। SkippyFire इस बात का बिल्कुल उपयोग नहीं किया गया था कि इसका उपयोग कैसे किया जाता है। यह बहुत आसान है: यदि आपको म्यूटेबल की आवश्यकता है तो म्यूटेबल लौटाएं, अगर आपको म्यूटेबल की आवश्यकता नहीं है तो म्यूटेबल वापस न करें। –