चूंकि मुझे नहीं लगता कि यहां उत्तर सब कुछ कवर करते हैं, इसलिए मैं यहां एक छोटा जोड़ बनाना चाहता हूं।
Console.WriteLine(string format, params object[] pars)
कॉल करता है string.Format
। '+' से तात्पर्य है स्ट्रिंग संयोजन। मुझे नहीं लगता कि यह हमेशा स्टाइल के साथ करना है; मैं जिस संदर्भ में हूं, उसके आधार पर दो शैलियों को मिलाना चाहता हूं।
संक्षिप्त जवाब
आपके द्वारा लिए गए निर्णय को स्ट्रिंग आवंटन के साथ करना होगा। मैं इसे सरल बनाने की कोशिश करूंगा।
बोलो तुम्हारे पास है
string s = a + "foo" + b;
यदि आप इसे निष्पादित करते हैं, तो यह निम्नानुसार मूल्यांकन करेगा:
string tmp1 = a;
string tmp2 = "foo"
string tmp3 = concat(tmp1, tmp2);
string tmp4 = b;
string s = concat(tmp3, tmp4);
tmp
यहाँ वास्तव में एक स्थानीय चर नहीं है, लेकिन यह JIT के लिए अस्थायी है (यह IL स्टैक पर धकेल दिया गया है)। यदि आप स्टैक पर स्ट्रिंग दबाते हैं (जैसे कि ldstr
आईएल के लिए शाब्दिक रूप से), तो आप स्टैक पर स्ट्रिंग पॉइंटर का संदर्भ देते हैं।
जिस क्षण आप concat
इस संदर्भ को कहते हैं , वह एक समस्या बन जाता है, क्योंकि कोई स्ट्रिंग संदर्भ उपलब्ध नहीं है जिसमें दोनों तार शामिल हैं। इसका मतलब है कि .NET को मेमोरी के एक नए ब्लॉक को आवंटित करने की आवश्यकता है, और फिर इसे दो स्ट्रिंग्स के साथ भरें। यह एक समस्या है, इसका कारण यह है कि आवंटन अपेक्षाकृत महंगा है।
जो इस सवाल को बदल देता है: आप concat
संचालन की संख्या कैसे कम कर सकते हैं ?
तो, मोटे तौर पर उत्तर यह है: string.Format
> 1 कंसर्ट के लिए, '+' 1 कॉनकैट के लिए ठीक काम करेगा। और अगर आप सूक्ष्म प्रदर्शन अनुकूलन करने की परवाह नहीं string.Format
करते हैं, तो सामान्य मामले में ठीक काम करेगा।
संस्कृति के बारे में एक नोट
और फिर वहाँ कुछ संस्कृति कहा जाता है ...
string.Format
आपको CultureInfo
अपने स्वरूपण में उपयोग करने में सक्षम बनाता है । एक साधारण ऑपरेटर '+' वर्तमान संस्कृति का उपयोग करता है।
यदि आप फ़ाइल प्रारूप और f.ex लिख रहे हैं तो यह विशेष रूप से एक महत्वपूर्ण टिप्पणी है। double
मान जो आप एक स्ट्रिंग में 'जोड़'ते हैं। विभिन्न मशीनों पर, यदि आप string.Format
स्पष्ट रूप से उपयोग नहीं करते हैं, तो आप अलग-अलग तारों के साथ समाप्त हो सकते हैं CultureInfo
।
F.ex. विचार करें कि क्या होता है यदि आप 'a' बदलते हैं। एक ',' के लिए अपनी अल्पविराम-मूल्यों की फ़ाइल लिखते समय ... डच में दशमलव विभाजक एक अल्पविराम होता है, इसलिए आपके उपयोगकर्ता को 'मज़ेदार' आश्चर्य मिल सकता है।
अधिक निराधार उत्तर
यदि आप पहले से ही स्ट्रिंग के सटीक आकार को नहीं जानते हैं, तो इस तरह की नीति का उपयोग करना सबसे अच्छा है कि आप अपने द्वारा उपयोग किए जाने वाले बफ़र्स को समग्र रूप से उपयोग करें। स्लैक स्पेस पहले भरा जाता है, उसके बाद डाटा को कॉपी किया जाता है।
बढ़ते का मतलब है कि मेमोरी का एक नया ब्लॉक आवंटित करना और पुराने डेटा को नए बफर में कॉपी करना। स्मृति के पुराने ब्लॉक को तब छोड़ा जा सकता है। आपको इस बिंदु पर नीचे की रेखा मिलती है: बढ़ते हुए एक महंगा ऑपरेशन है।
ऐसा करने का सबसे व्यावहारिक तरीका एक समग्र नीति का उपयोग करना है। सबसे आम नीति 2 की शक्तियों में बफ़र्स को समग्र रूप से अलग करना है। बेशक, आपको इसे इससे थोड़ा अधिक समझदारी से करना होगा (क्योंकि यह 1,2,4,8 से बढ़ने का कोई मतलब नहीं है, यदि आप पहले से ही जानते हैं कि आपको 128 वर्णों की आवश्यकता है ) लेकिन आपको तस्वीर मिल गई। नीति यह सुनिश्चित करती है कि आपको ऊपर वर्णित कई महंगे ऑपरेशनों की आवश्यकता नहीं है।
StringBuilder
एक ऐसा वर्ग है जो मूल रूप से दो की शक्तियों में अंतर्निहित बफर को समग्र करता है। हुड के तहत string.Format
उपयोग करता है StringBuilder
।
यह आपके निर्णय को समग्र-और-परिशिष्ट (-multiple) (w / wo कल्चर) या सिर्फ आवंटित और परिशिष्ट के बीच एक बुनियादी व्यापार-बंद बनाता है।
string.Format
जो किसी भी कंपोजिट फॉर्मेटिंग फीचर्स (यानी सिंपल सिंपल{0}
) का उपयोग नहीं करता है और उन्हें काफी तेज स्ट्रिंग कॉन्सेप्टेशन से बदल देता है। मुझे आश्चर्य है कि इस तरह के करतब एक मौजूदा IL राइटर जैसे PostSharp के साथ प्राप्त करने योग्य हैं।