स्ट्रिंग स्ट्रिंग का उपयोग करने के लिए बेहतर है।


120

मुझे एक छोटा सा कोड कोड मिला है जो एक्सेल में सेल इनपुट निर्धारित करने के लिए एक इंडेक्स वैल्यू को पार्स कर रहा है। यह मुझे सोच रहा है ...

के बीच क्या अंतर है

xlsSheet.Write("C" + rowIndex.ToString(), null, title);

तथा

xlsSheet.Write(string.Format("C{0}", rowIndex), null, title);

क्या यह दूसरे से बढ़िया है? और क्यों?



डुप्लिकेट का संभावित डुप्लिकेट क्यों उपयोग करें।
ड्रुइड

जवाबों:


115

C # 6 से पहले

ईमानदार होने के लिए, मुझे लगता है कि पहला संस्करण सरल है - हालांकि मैं इसे सरल करूंगा:

xlsSheet.Write("C" + rowIndex, null, title);

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

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

C # 6 के साथ

स्ट्रिंग इंटरपोलेशन से सी # 6 में पढ़ने के लिए बहुत सी चीजें आसान हो जाती हैं। इस मामले में, आपका दूसरा कोड बन जाता है:

xlsSheet.Write($"C{rowIndex}", null, title);

जो शायद सबसे अच्छा विकल्प है, IMO।



मैं जानता हूँ मैं जानता हूँ। इसे जेस्ट में बनाया गया था (इससे पहले लिंक btw पढ़ा है, जो एक अच्छा पढ़ा गया था)
nawfal

जॉन। मैं हमेशा मिस्टर रिक्टर का प्रशंसक रहा हूं, और धार्मिक रूप से मुक्केबाजी आदि पर मार्गदर्शन किया है। हालांकि, आपके (पुराने) लेख को पढ़ने के बाद, मैं अब एक रूपांतरित हूं। धन्यवाद
stevethethread


4
अब जब कि C # 6 उपलब्ध है, तो आप मेरे लिए और भी आसान पठनीयता के लिए नए स्ट्रिंग प्रक्षेप सिंटैक्स का उपयोग कर सकते हैं:xlsSheet.Write($"C{rowIndex}", null, title);
HotN

158

मेरी प्रारंभिक वरीयता (C ++ पृष्ठभूमि से आने वाली) String.Format के लिए थी। निम्नलिखित कारणों से मैंने इसे बाद में छोड़ दिया:

  • स्ट्रिंग कॉन्सेप्टन यकीनन "सुरक्षित" है। यह मेरे लिए हुआ (और मैंने देखा है कि यह कई अन्य डेवलपर्स के लिए होता है) एक पैरामीटर को हटाने के लिए, या गलती से पैरामीटर ऑर्डर को गड़बड़ कर देता है। संकलक प्रारूप स्ट्रिंग के खिलाफ मापदंडों की जांच नहीं करेगा और आप एक रनटाइम त्रुटि के साथ समाप्त होते हैं (यदि आप भाग्यशाली हैं कि यह अस्पष्ट विधि में नहीं है, जैसे कि त्रुटि लॉग करना)। संघनन के साथ, एक पैरामीटर को हटाने से त्रुटि की संभावना कम होती है। आप तर्क दे सकते हैं कि त्रुटि की संभावना बहुत कम है, लेकिन ऐसा हो सकता है।

- स्ट्रिंग संघनन अशक्त मूल्यों के लिए अनुमति देता है, String.Formatनहीं। लेखन " s1 + null + s2" नहीं टूटता है, यह केवल शून्य मान को स्ट्रिंग के रूप में मानता है। खाली। खैर, यह आपके विशिष्ट परिदृश्य पर निर्भर हो सकता है - ऐसे मामले हैं जहां आप एक अशक्त फर्स्टनाम को अनदेखा करने के बजाय एक त्रुटि चाहेंगे। हालाँकि इस स्थिति में भी मैं व्यक्तिगत रूप से खुद को नल के लिए जाँचना पसंद करता हूँ और मानक ArgumentNullException I के बजाय विशिष्ट त्रुटियों को फेंकने से मैं String.Format से प्राप्त करता हूं।

  • स्ट्रिंग संघनन बेहतर प्रदर्शन करता है। ऊपर दिए गए कुछ पोस्ट पहले से ही इसका उल्लेख करते हैं (वास्तव में यह समझाए बिना कि, जिसने मुझे इस पोस्ट को लिखने के लिए निर्धारित किया :)।

आइडिया है। .NET कंपाइलर इस कोड को बदलने के लिए काफी स्मार्ट है:

public static string Test(string s1, int i2, int i3, int i4, 
        string s5, string s6, float f7, float f8)
{
    return s1 + " " + i2 + i3 + i4 + " ddd " + s5 + s6 + f7 + f8;
}

इसके लिए:

public static string Test(string s1, int i2, int i3, int i4,
            string s5, string s6, float f7, float f8)
{
    return string.Concat(new object[] { s1, " ", i2, i3, i4, 
                    " ddd ", s5, s6, f7, f8 });
}

String.Concat के हुड के नीचे क्या होता है, इसका अनुमान लगाना आसान है (रिफ्लेक्टर का उपयोग करें)। सरणी में ऑब्जेक्ट ToString () के माध्यम से उनके स्ट्रिंग में परिवर्तित हो जाते हैं। फिर कुल लंबाई की गणना की जाती है और केवल एक स्ट्रिंग आवंटित की जाती है (कुल लंबाई के साथ)। अंत में, प्रत्येक स्ट्रिंग को कोड के कुछ असुरक्षित टुकड़े में wstrcpy के माध्यम से परिणामी स्ट्रिंग में कॉपी किया जाता है।

कारण String.Concatतेजी से रास्ता है? ठीक है, हम सब देख सकते हैं कि क्या String.Formatकर रहा है - आपको प्रारूप स्ट्रिंग को संसाधित करने के लिए आवश्यक कोड की मात्रा पर आश्चर्य होगा। इसके शीर्ष पर (मैंने मेमोरी खपत के बारे में टिप्पणियां देखी हैं), String.Formatआंतरिक रूप से एक स्ट्रिंगबर्ल का उपयोग करता है। ऐसे:

StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));

प्रत्येक पारित तर्क के लिए, यह 8 वर्णों को सुरक्षित रखता है। यदि तर्क एक-अंकों का मान है, तो बहुत बुरा है, हमारे पास कुछ जगह बर्बाद है। यदि तर्क कुछ लंबे पाठ को वापस करने वाली एक कस्टम ऑब्जेक्ट है ToString(), तो हो सकता है कि कुछ वास्तविककरण की भी आवश्यकता हो (सबसे खराब स्थिति, निश्चित रूप से)।

इसकी तुलना में, संघनन केवल वस्तु सरणी के स्थान को बर्बाद करता है (बहुत ज्यादा नहीं, खाते में इसे संदर्भों की एक सरणी है)। प्रारूप विनिर्देशक और कोई मध्यस्थ StringBuilder के लिए कोई पार्स नहीं है। बॉक्सिंग / अनबॉक्सिंग ओवरहेड दोनों विधियों में मौजूद है।

केवल एक कारण मैं String.Format के लिए जाना होगा जब स्थानीयकरण शामिल है। संसाधनों में प्रारूपण स्ट्रिंग डालना आपको कोड के साथ खिलवाड़ किए बिना विभिन्न भाषाओं का समर्थन करने की अनुमति देता है (उन परिदृश्यों के बारे में सोचें जहां स्वरूपित मान भाषा के आधार पर क्रम बदलते हैं, अर्थात् "{0} घंटे और {1} मिनट" के बाद जापानी में काफी भिन्न दिख सकते हैं: )।


मेरी पहली (और काफी लंबी) पोस्ट को योग करने के लिए:

  • मेरे लिए सबसे अच्छा तरीका (प्रदर्शन बनाम रखरखाव / पठनीयता के संदर्भ में) बिना किसी ToString()कॉल के , स्ट्रिंग संयोजन का उपयोग कर रहा है
  • यदि आप प्रदर्शन के बाद हैं, तो ToString()बॉक्सिंग से बचने के लिए खुद को कॉल करें (मैं पठनीयता के प्रति कुछ हद तक पक्षपाती हूं) - आपके प्रश्न में पहला विकल्प
  • यदि आप उपयोगकर्ता को स्थानीयकृत स्ट्रिंग दिखा रहे हैं (यहाँ मामला नहीं है), String.Format()एक किनारे है।

5
1) string.FormatReSharper का उपयोग करते समय "सुरक्षित" है; वह है, यह किसी भी अन्य कोड की तरह ही सुरक्षित है जिसका उपयोग [गलत तरीके से] किया जा सकता है। 2) string.Format है एक "सुरक्षित" के लिए अनुमति null: string.Format("A{0}B", (string)null)"अटल बिहारी" में परिणाम है। 3) मैं शायद ही कभी इस स्तर के प्रदर्शन के बारे में परवाह करता हूं (और उस अंत तक, यह एक दुर्लभ दिन है जब मैं बाहर निकालता हूं StringBuilder) ...

2 पर सहमत), मैं पोस्ट को संपादित करूंगा। यह सत्यापित नहीं किया जा सकता है कि यह 1.1 में सुरक्षित था, लेकिन नवीनतम ढांचा वास्तव में अशक्त है।
दान सी।

यदि कोई एक पैरामीटर एक पैरामीटर या चर के बजाय रिटर्न वैल्यू के साथ कॉल करने का एक तरीका है, तो string.Concat अभी भी उपयोग किया जाता है?
रिचर्ड कोलेट

2
@ रिचर्डकोलेट हाँ, String.Concat का उपयोग आप भी कॉल कॉन्टेक्ट वैल्यू ऑफ़ मेथड कॉन्टेक्ट में करते हैं, उदाहरण के string s = "This " + MyMethod(arg) + " is a test";लिए संकलित किया जाता है aString.Concat() रिलीज़ मोड में कॉल है।
दान सी।

शानदार जवाब; बहुत अच्छा लिखा और समझाया।
फ्रैंक वी।

6

मुझे लगता है कि पहला विकल्प अधिक पठनीय है और यह आपकी प्राथमिक चिंता होनी चाहिए।

xlsSheet.Write("C" + rowIndex.ToString(), null, title);

string.Format हुड के नीचे एक StringBuilder ( परावर्तक के साथ जांच ) का उपयोग करता है, इसलिए इसका कोई प्रदर्शन लाभ नहीं होगा जब तक कि आप एक महत्वपूर्ण मात्रा में संघनन नहीं कर रहे हैं। यह आपके परिदृश्य के लिए धीमा होगा लेकिन वास्तविकता यह है कि माइक्रो प्रदर्शन अनुकूलन निर्णय अधिकांश समय अनुचित है और आपको वास्तव में अपने कोड की पठनीयता पर ध्यान केंद्रित करना चाहिए जब तक कि आप लूप में न हों।

किसी भी तरह से, पहले पठनीयता के लिए लिखें और फिर अपने हॉटस्पॉट की पहचान करने के लिए एक प्रदर्शन प्रोफाइलर का उपयोग करें यदि आप वास्तव में सोचते हैं कि आपके पास प्रदर्शन चिंताएं हैं।



5

एक साधारण मामले के लिए जहां यह एक सरल एकल संयोजन है, मुझे लगता है कि यह string.Format(और मैंने परीक्षण नहीं किया है, लेकिन इसकी जटिलता के लायक नहीं है, लेकिन मुझे संदेह है कि इस तरह के एक साधारण मामले के लिए, थोड़ा धीमा string.Format हो सकता है, प्रारूप स्ट्रिंग पार्सिंग के साथ क्या हो सकता है और सभी)। जॉन स्कीट की तरह, मैं स्पष्ट रूप से कॉल नहीं करना पसंद करता हूं.ToString() , क्योंकि यह string.Concat(string, object)ओवरलोड द्वारा अंतर्निहित रूप से किया जाएगा , और मुझे लगता है कि कोड क्लीनर-दिखने वाला है और इसके बिना पढ़ना आसान है।

लेकिन कुछ से अधिक संघनन (कितने व्यक्तिपरक हैं) के लिए, मैं निश्चित रूप से पसंद करता हूं string.Format । एक निश्चित बिंदु पर मैं सोचता हूं कि पठनीयता के साथ पठनीयता और प्रदर्शन दोनों अनावश्यक रूप से पीड़ित हैं।

यदि प्रारूप स्ट्रिंग के कई पैरामीटर हैं (फिर से, "कई" व्यक्तिपरक हैं), मैं आमतौर पर प्रतिस्थापन तर्कों पर टिप्पणी सूचकांकों को शामिल करना पसंद करता हूं, ऐसा नहीं है कि मैं किस पैरामीटर का मान खोता हूं, किस पैरामीटर पर जाता है। एक आकस्मिक उदाहरण:

Console.WriteLine(
    "Dear {0} {1},\n\n" +

    "Our records indicate that your {2}, \"{3}\", is due for {4} {5} shots.\n" +
    "Please call our office at 1-900-382-5633 to make an appointment.\n\n" +

    "Thank you,\n" +
    "Eastern Veterinary",

    /*0*/client.Title,
    /*1*/client.LastName,
    /*2*/client.Pet.Animal,
    /*3*/client.Pet.Name,
    /*4*/client.Pet.Gender == Gender.Male ? "his" : "her",
    /*5*/client.Pet.Schedule[0]
);

अपडेट करें

यह मेरे लिए होता है कि मैंने जो उदाहरण दिया है, वह थोड़ा भ्रमित करने वाला है, क्योंकि ऐसा प्रतीत होता है कि मैंने सहमति और यहाँ दोनों का उपयोग किया string.Formatहै। और हाँ, तार्किक रूप से और शाब्दिक रूप से, यही मैंने किया है। लेकिन कंसीलर 1 से कॉन्टेक्ट 1 से दूर हो जाएंगे । इसलिए रन-टाइम पर, एक ही स्ट्रिंग होगी। इसलिए मुझे लगता है कि मुझे यह कहना चाहिए कि मैं समय के साथ कई कार्यक्रमों से बचना पसंद करता हूं ।

बेशक, इस विषय में से अधिकांश अब पुराने हैं, जब तक कि आप अभी भी C # 5 या पुराने का उपयोग कर रहे हैं। अब हमारे पास प्रक्षेपित तार हैं , जो पठनीयता के लिए string.Format, लगभग सभी मामलों में बेहतर हैं । इन दिनों, जब तक मैं सीधे एक स्ट्रिंग शाब्दिक की शुरुआत या अंत में एक मान नहीं कर रहा हूं, मैं लगभग हमेशा स्ट्रिंग प्रक्षेप का उपयोग करता हूं। आज, मैं अपने पहले के उदाहरण को इस तरह लिखूंगा:

Console.WriteLine(
    $"Dear {client.Title} {client.LastName},\n\n" +

    $"Our records indicate that your {client.Pet.Animal}, \"{client.Pet.Name}\", " +
    $"is due for {(client.Pet.Gender == Gender.Male ? "his" : "her")} " +
    $"{client.Pet.Schedule[0]} shots.\n" +
    "Please call our office at 1-900-382-5633 to make an appointment.\n\n" +

    "Thank you,\n" +
    "Eastern Veterinary"
);

आप इस तरह से संकलन-समय खो देते हैं। प्रत्येक प्रक्षेपित स्ट्रिंग string.Formatको कंपाइलर द्वारा एक कॉल में बदल दिया जाता है , और उनके परिणामों को रन टाइम पर संक्षिप्त किया जाता है। इसका मतलब है कि यह पठनीयता के लिए रन-टाइम प्रदर्शन का एक बलिदान है। अधिकांश समय, यह एक सार्थक बलिदान है, क्योंकि रन-टाइम दंड नगण्य है। प्रदर्शन क्रिटिकल कोड में, हालांकि, आपको विभिन्न समाधानों की रूपरेखा तैयार करनी पड़ सकती है।


1 आप इसे सी # विनिर्देशन में देख सकते हैं :

... निरंतर अभिव्यक्ति में निम्नलिखित निर्माणों की अनुमति है:

...

  • पूर्वनिर्धारित + ... बाइनरी ऑपरेटर ...

आप इसे एक छोटे से कोड से भी सत्यापित कर सकते हैं:

const string s =
    "This compiles successfully, " +
    "and you can see that it will " +
    "all be one string (named `s`) " +
    "at run time";

1
फ़िजी, आप सभी समारोहों के बजाय @ "... मल्टी लाइन स्ट्रिंग" का उपयोग कर सकते हैं।
हारून पामर

हां, लेकिन फिर आपको अपनी स्ट्रिंग को सही ठहराना होगा। @ स्ट्रिंग में उद्धरण के बीच सभी नई लाइनें और टैब वर्ण शामिल हैं।
पी डैडी

मुझे पता है कि यह पुराना है, लेकिन यह एक ऐसा मामला है जहां मैं कहूंगा कि मैं एक रेक्स फ़ाइल में प्रारूप स्ट्रिंग डालूंगा।
एंडी

2
वाह, सबका ध्यान मामले के दिल के बजाय, स्ट्रिंग शाब्दिक पर केंद्रित है।
पी डैडी

heheh - मैं सिर्फ आपके अंदर क्रिस्टिंगन कॉन्सट्रैटन को देख रहा थाString.Format()
क्रिस्टोफर

3

यदि आपकी स्ट्रिंग कई चरों के साथ अधिक जटिल होती है, तो मैं स्ट्रिंग का चयन करूंगा ।ormat ()। लेकिन स्ट्रिंग और आकार की संख्या के लिए आपके मामले में परिवर्तन किया जा रहा है, मैं आपके पहले संस्करण के साथ जाऊंगा, यह अधिक संयमी है


3

मैंने String.Format (Reflector का उपयोग करके) पर एक नज़र डाली है और यह वास्तव में एक StringBuilder बनाता है तो उस पर AppendFormat कहता है। इसलिए यह कई हलचल के लिए कॉनकैट से तेज है। क्विकेस्ट (मुझे विश्वास है) एक स्ट्रिंगबर्ल बना रहा होगा और मैन्युअल रूप से एपेंड करने के लिए कॉल कर रहा होगा। बेशक "कई" की संख्या अनुमान लगाने के लिए है। मैं आपके उदाहरण के रूप में कुछ के लिए + (वास्तव में और वास्तव में मैं एक VB प्रोग्रामर हूँ) का उपयोग करेगा। के रूप में यह और अधिक जटिल हो जाता है मैं String.Format का उपयोग करें। अगर बहुत सारे वैरिएबल हैं तो मैं एक स्ट्रिंगबुलस्ट और अपेंड के लिए जाऊंगा, उदाहरण के लिए, हमारे पास कोड है जो कोड बनाता है, मैं वास्तविक कोड की एक लाइन का उपयोग जनरेट किए गए कोड की एक लाइन को आउटपुट करने के लिए करता हूं।

ऐसा लगता है कि इनमें से प्रत्येक ऑपरेशन के लिए कितने तार मिलते हैं, जिससे कुछ सरल उदाहरण मिलते हैं।

"C" + rowIndex.ToString();

"सी" पहले से ही एक स्ट्रिंग है।
rowIndex.ToString () एक और स्ट्रिंग बनाता है। (@manohard - rowIndex की कोई बॉक्सिंग नहीं होगी)
तब हमें अंतिम स्ट्रिंग मिलती है।
अगर हम इसका उदाहरण लें

String.Format("C(0)",rowIndex);

तब हमारे पास "C {0}" होता है क्योंकि एक स्ट्रिंग
रोइंडएंड बॉक्स को फंक्शन में पास करने के लिए बॉक्सिंग हो जाता है।
एक नया
स्ट्रिंगबिल्डर बनाया जाता है AppendFormat को स्ट्रिंग बिल्डर पर कहा जाता है - मुझे इस बात का विवरण नहीं पता है कि AppendFormat कैसे कार्य करता है लेकिन यह मान लेता है। अल्ट्रा कुशल, यह अभी भी बॉक्सिंग rowIndex को एक स्ट्रिंग में बदलना है।
फिर स्ट्रिंगर को एक नए स्ट्रिंग में परिवर्तित करें।
मुझे पता है कि स्ट्रिंगरबिल्डर्स व्यर्थ मेमोरी कॉपी को लेने से रोकने का प्रयास करते हैं, लेकिन स्ट्रिंग.फॉर्मट अभी भी प्लेन कंसीनेशन की तुलना में अतिरिक्त ओवरहेड के साथ समाप्त होता है।

यदि हम अब कुछ और तार के साथ एक उदाहरण लेते हैं

"a" + rowIndex.ToString() + "b" + colIndex.ToString() + "c" + zIndex.ToString();

हमारे पास शुरू करने के लिए 6 तार हैं, जो सभी मामलों के लिए समान होंगे।
संघटन का उपयोग करते हुए हमारे पास 4 मध्यवर्ती स्ट्रिंग और अंतिम परिणाम भी हैं। यह उन मध्यवर्ती परिणाम हैं जो स्ट्रिंग, प्रारूप (या स्ट्रिंगबर्ल) का उपयोग करके समाप्त हो जाते हैं।
याद रखें कि प्रत्येक मध्यवर्ती स्ट्रिंग बनाने के लिए, पिछले को एक नए मेमोरी लोकेशन पर कॉपी किया जाना चाहिए, यह केवल मेमोरी आवंटन नहीं है जो संभावित रूप से धीमा है।


4
Nitpick। "A" + ... + "b" + ... + "c" + ... में, आपके पास वास्तव में 4 मध्यवर्ती स्ट्रिंग्स नहीं होंगे। कंपाइलर String.Concat (params string [] मान) स्टैटिक विधि से कॉल उत्पन्न करेगा, और वे सभी एक ही बार में सम्‍मिलित हो जाएंगे। मैं अभी भी स्ट्रिंग पसंद करूँगा। पठनीयता के लिए, हालांकि।
पी डैडी

2

मुझे String.Format पसंद है क्योंकि आपके स्वरूपित पाठ को इनलाइन संगति से पालन करने और पढ़ने में बहुत आसान बना सकता है, साथ ही इसके अधिक लचीलेपन से आप अपने मापदंडों को प्रारूपित कर सकते हैं, हालाँकि आपके जैसे छोटे उपयोगों के लिए मुझे समसामयिक समस्याओं के बारे में कोई समस्या नहीं है।

छोरों के अंदर या बड़े तारों में संघनन के लिए आपको हमेशा स्ट्रिंगबर्स्ट वर्ग का उपयोग करने का प्रयास करना चाहिए।


2

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

हालांकि, अगर मुझे लगता था कि मैं string.Format()अधिक जटिल परिदृश्यों के लिए एक किनारे दे सकता हूं । लेकिन यह एक आंत की भावना से अधिक है कि यह कई अपरिवर्तनीय तारों के उत्पादन के बजाय एक बफर का उपयोग करने के लिए एक बेहतर काम करने की संभावना है, और किसी भी वास्तविक डेटा पर आधारित नहीं है।


1

मैं उपरोक्त बिंदुओं के साथ सहमत हूं, एक और बिंदु जो मुझे लगता है कि उल्लेख किया जाना चाहिए कोड रखरखाव है। string.Format आसानी से कोड को बदलने की अनुमति देता है।

यानी मेरे पास एक संदेश है "The user is not authorized for location " + location या "The User is not authorized for location {0}"

अगर मैं कभी भी यह कहने के लिए संदेश बदलना चाहता हूं: location + " does not allow this User Access"या "{0} does not allow this User Access"

string.ormat के साथ मुझे बस इतना करना है की string को change कर दे। कॉन्‍टेनेटेशन के लिए मुझे उस संदेश को संशोधित करना होगा

यदि कई स्थानों पर उपयोग किया जाता है तो समय का आवंटन बचा सकता है।


1

मैं इस धारणा के तहत था कि string.format तेज था इस परीक्षण में यह 3 x धीमा लगता है

string concat = "";
        System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch    ();
        sw1.Start();
        for (int i = 0; i < 10000000; i++)
        {
            concat = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}","1", "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" , i);
        }
        sw1.Stop();
        Response.Write("format: "  + sw1.ElapsedMilliseconds.ToString());
        System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch();
        sw2.Start();
        for (int i = 0; i < 10000000; i++)
        {
            concat = "1" + "2" + "3" + "4" + "5" + "6" + "7" + "8" + "9" + "10" + i;
        }
        sw2.Stop();

string.format ने 4.6 सेकंड का समय लिया और '+' का उपयोग करते समय 1.6 सेकेंड का समय लिया।


7
संकलक "1" + "2" + "3" + "4" + "5" + "6" + "7" + "8" + "9" + "10"एक स्ट्रिंग शाब्दिक के रूप में पहचानता है , इसलिए प्रभावी रूप से वह रेखा बन जाती है "12345678910" + iजो पहले से तेज होती हैstring.Format(...)
wertzui

0

string.Format शायद एक बेहतर विकल्प है जब प्रारूप टेम्पलेट ("C {0}") एक कॉन्फ़िगरेशन फ़ाइल (जैसे Web.config / App.config) में संग्रहीत होता है


0

मैंने स्ट्रिंग सहित कई विभिन्न तरीकों की रूपरेखा तैयार की है। स्ट्रिंग, स्ट्रिंगबर्ल और स्ट्रिंग संयोजन। स्ट्रिंग कंसट्रक्शन ने लगभग हमेशा स्ट्रिंग्स के निर्माण के अन्य तरीकों से बेहतर प्रदर्शन किया। इसलिए, यदि प्रदर्शन महत्वपूर्ण है, तो बेहतर है। हालांकि, यदि प्रदर्शन महत्वपूर्ण नहीं है, तो मैं व्यक्तिगत रूप से स्ट्रिंग ढूंढता हूं। कोड में पालन करने के लिए आसान हो। (लेकिन यह एक व्यक्तिपरक कारण है) हालांकि स्ट्रिंगबर्ल शायद, स्मृति उपयोग के संबंध में सबसे अधिक कुशल है।



-1

स्ट्रिंग संघात की तुलना में स्ट्रिंग संघनन अधिक स्मृति लेता है। तार को समाप्‍त करने का सबसे अच्‍छा तरीका String.Format या System.Text.StringBuilder Object का उपयोग करना है।

चलो पहला मामला लेते हैं: "C" + rowIndex.ToString () मान लें कि rowIndex एक वैल्यू टाइप है, इसलिए ToString () मेथड को String में वैल्यू कन्वर्ट करने के लिए Box करना होता है और फिर CLR दोनों वैल्यू में शामिल नए स्ट्रिंग के लिए मेमोरी बनाता है।

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

छोटे तार के लिए यह मायने नहीं रखता कि मैं कितना ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.