c# - Does string.Replace(string, string) create additional strings? -
हमारे पास और मैं वर्तमान में यह कर रहा हूं: ज़रुरत है, यह कनवर्ट करता है यहाँ ये कारण है कि मैं यह कह रहा हूं: मैं कुछ किलोबाइट से सैकड़ों मेगाबाइट्स तक आकार में लेकर लेनदेन की फाइलों का प्रसंस्करण कर रहा हूं। अब तक मेरे पास एक प्रदर्शन / स्मृति समस्या नहीं थी, क्योंकि मैं अब भी बहुत छोटी फाइलों के साथ परीक्षण कर रहा हूं। लेकिन जब मेगाबाइट की बात आती है तो मुझे यकीन नहीं है कि मुझे इन अतिरिक्त स्ट्रिंग्स के साथ समस्याएं होंगी। मुझे संदेह है कि यह मामला होगा क्योंकि लाखों रिकॉर्ड के साथ यह अतिरिक्त मेमोरी खपत काफी बढ़ेगा। मैं आउटपुट फाइल निर्माण के लिए पहले से ही s का उपयोग कर रहा हूं। और मुझे यह भी पता है कि (समय के अंत से पहले कुछ बिंदु पर)। मैं सोच रहा था कि क्या एक स्ट्रिंग में एक विशेष वर्ण / सबस्ट्रिंग के सभी संस्करणों को बदलने का एक बेहतर, और अधिक कुशल तरीका है, जो अतिरिक्त रूप से एक स्ट्रिंग नहीं बनाते। अच्छा, मैं एक .नेट डेवलपमेंट टीम सदस्य (दुर्भाग्यवश) नहीं हूं, लेकिन मैं आपके प्रश्न का उत्तर देने का प्रयास करूंगा। माइक्रोसॉफ्ट के पास एक महान .NET संदर्भ स्रोत कोड की साइट, और, अब, अगर हम कार्यान्वयन का पालन करेंगे, तो हम देखेंगे कि यह वास्तव में क्या है। / P> स्ट्रिंग ऑब्जेक्ट्स पर थोड़ा अधिक : यद्यपि। अब, अतः, अगर आपको स्ट्रिंग में परिवर्तन करने के लिए तेज़ और स्मृति कुशल तरीके की आवश्यकता है , StringBuilder निश्चित रूप से आपकी पसंद है खासकर यदि आप " स्ट्रिंग में बार-बार संशोधन करने वाले " dd / mm / yyyy प्रारूप में दिनांक युक्त स्ट्रिंग को बदलने की आवश्यकता है
ddmmyyyy प्रारूप (यदि आप जानना चाहते हैं कि मैं तारों में तारों को संग्रहीत क्यों कर रहा हूं, तो मेरे सॉफ़्टवेयर में थोक लेनदेन फाइलें होती हैं, जो कि एक बैंक द्वारा उपयोग की जाने वाली रेखा आधारित पाठ फ़ाइल स्वरूप है)।
स्ट्रिंग पुराना फ़ॉर्मेट = "01/01/2014"; स्ट्रिंग newFormat = पुराना फ़ॉर्मेट। बदलें ("/", "");
"01/01/2014" से
"01012014" । लेकिन मेरा सवाल है, एक चरण में होने वाली जगह को बदलता है या क्या यह एक मध्यवर्ती स्ट्रिंग बनाता है (उदाहरण:
"0101/2014" या
"01/012014"
स्ट्रिंग। पुनः बदलें एक बाहरी विधि कॉल करता है जो काम करता है मैं यह कैसे लागू किया जाता है के बारे में बहस नहीं होता, लेकिन इस पद्धति में एक छोटी सी टिप्पणी है जो आपके प्रश्न का उत्तर दे सकती है:
// इस पद्धति में स्ट्रिंगबिलर प्रतिस्थापन के रूप में एक ही कार्यक्षमता है। एकमात्र अंतर यह है कि // एक नया स्ट्रिंग को आवंटित किया जाना चाहिए क्योंकि स्ट्रिंग अपरिवर्तनीय है
स्ट्रिंग .नेट में अपरिवर्तनीय है, यह किसी प्रकार की सीमा नहीं है , यह एक अनुबंध है स्ट्रिंग वास्तव में एक संदर्भ प्रकार है, और इसमें क्या शामिल है वास्तविक स्ट्रिंग की लंबाई + वर्णों का बफर आप वास्तव में इस बफर में एक असुरक्षित सूचक प्राप्त कर सकते हैं और इसे "फ़्लाई पर" बदल सकते हैं, लेकिन मैं ऐसा करने की अनुशंसा नहीं कर सकता।
स्ट्रिंगबिल्डर वर्ग में भी एक चरित्र सरणी, और जब आप स्ट्रिंग को इसके कन्स्ट्रक्टर में पास करते हैं, तो यह वास्तव में स्ट्रिंग के बफर को अपने दम पर (संदर्भ स्रोत देखें)। यह क्या नहीं है, हालांकि, अचूकता का अनुबंध है, इसलिए जब आप StringBuilder का उपयोग करते हुए स्ट्रिंग को संशोधित करते हैं तो आप वास्तव में चार सरणी के साथ काम कर रहे हैं ध्यान दें कि जब आप स्ट्रिंगबिल्ल्डर पर ToString () को कॉल करते हैं, तो वह एक नया "अपरिवर्तनीय" स्ट्रिंग बनाता है, जिसमें कोई भी उसके बफर का प्रतिलिपि बनाता है।
Comments
Post a Comment