2008-12-08 8 views
50

स्ट्रिंग.फॉर्मैट() का उपयोग करने के बारे में हाल ही में question came up। मेरे उत्तर के भाग में StringBuilder.AppendLine (string.Format (...)) का उपयोग करने के लिए एक सुझाव शामिल था। जॉन स्कीट ने सुझाव दिया कि यह एक बुरा उदाहरण था और AppendLine और AppendFormat के संयोजन का उपयोग करके प्रस्तावित किया गया था।जब आप StringBuilder का उपयोग करते हैं। AppendLine/string.Format बनाम StringBuilder.AppendFormat?

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

sbuilder.AppendFormat("{0} line", "First").AppendLine(); 
sbuilder.AppendFormat("{0} line", "Second").AppendLine(); 

// as opposed to: 

sbuilder.AppendLine(String.Format("{0} line", "First")); 
sbuilder.AppendLine(String.Format("{0} line", "Second")); 
+0

शायद आपका कोड नमूना दोनों मामलों को चित्रित कर सकता है? :) – annakata

उत्तर

56

मैं AppendFormatAppendLine के रूप में न केवल अधिक पठनीय, लेकिन यह भी की तुलना में अधिक performant के बाद देखने AppendLine(string.Format(...)) पर कॉल करना।

उत्तरार्द्ध एक पूरी नई स्ट्रिंग बनाता है और फिर इसे मौजूदा निर्माता में थोक जोड़ता है। मैं कहने के लिए नहीं जा रहा हूं "स्ट्रिंगबिल्डर का उपयोग क्यों परेशान करते हैं?" लेकिन यह स्ट्रिंगबिल्डर की भावना के खिलाफ थोड़ा सा प्रतीत होता है। (String.Format())

+0

हाँ, मैं इसे पूरी तरह से ले जाऊंगा (और मुझे इसे पहले स्थान पर लेने के लिए धन्यवाद, बीटीडब्लू)। –

+1

कोई समस्या नहीं - और खेद है कि मेरी टिप्पणी मूल टिप्पणी में दिखाई दे रही है। मल्टीटास्किंग कभी-कभी मुझे यह करती है :( –

0

AppendFormat() एक बहुत अधिक AppendLine से पढ़ी जा सकती है

0

मैं इस संरचना पसंद करते हैं:

sbuilder.AppendFormat("{0} line\n", "First"); 

बेशक वहाँ कुछ लाइन को अलग करने के लिए कहा जा रहा है हालांकि टूट जाता है।

+1

मुझे लगता है कि "jinx" SO पर काम नहीं करता है, है ना? – Coderer

+0

मैं \ r \ n का उपयोग करने के लिए प्रतिबद्ध था, लेकिन मैं पर्यावरण पसंद करता हूं। न्यूलाइन जो उपयोग करने के लिए अजीब है। इसलिए सवाल पूछना –

0

यह सिर्फ सकारात्मक भयंकर बस

sbuilder.AppendFormat("{0} line\n", first); 

उपयोग करने के लिए है? मेरा मतलब है, मुझे पता है कि यह मंच-स्वतंत्र या जो भी नहीं है, लेकिन 10 में से 9 मामलों में यह काम पूरा हो जाता है।

2

यदि प्रदर्शन महत्वपूर्ण है, तो AppendFormat() को पूरी तरह से बचने का प्रयास करें। इसके बजाय एकाधिक परिशिष्ट() या AppendLine() कॉल का उपयोग करें। यह आपके कोड को बड़ा और कम पठनीय बनाता है, लेकिन यह तेज़ है क्योंकि कोई स्ट्रिंग पार्सिंग नहीं की जानी चाहिए। स्ट्रिंग पार्सिंग आप कल्पना कर सकते हैं की तुलना में धीमी है।

मैं आम तौर पर उपयोग करें:

sbuilder.AppendFormat("{0} line", "First"); 
sbuilder.AppendLine(); 
sbuilder.AppendFormat("{0} line", "Second"); 
sbuilder.AppendLine(); 

जब तक प्रदर्शन, महत्वपूर्ण है जो मामले में मैं का उपयोग करेंगे:

sbuilder.Append("First"); 
sbuilder.AppendLine(" line"); 
sbuilder.Append("Second"); 
sbuilder.AppendLine(" line"); 

(बेशक, यह अधिक मतलब होता अगर "सबसे पहले" और " दूसरा "जहां स्ट्रिंग अक्षर नहीं हैं)

+0

AppendFormat के खराब प्रदर्शन के लिए आपका सबूत क्या है? –

+0

मैंने 4 बेंचमार्क के साथ एक एपेंडफॉर्मैट() कॉल के बजाय पृथक परिशिष्ट() कॉल का उपयोग करते समय 5 बार प्रदर्शन प्रदर्शन दिखाया। – Chris

11

स्ट्रिंग.फॉर्मेट आंतरिक रूप से एक स्ट्रिंगबिल्डर ऑब्जेक्ट बनाता है।

sbuilder.AppendLine(String.Format("{0} line", "First")); 

स्ट्रिंग बिल्डर का एक अतिरिक्त उदाहरण, इसके सभी ओवरहेड बनने के साथ। mscorlib पर


परावर्तक, Commonlauageruntimelibary, System.String.Format

public static string Format(IFormatProvider provider, string format, params object[] args) 
{ 
    if ((format == null) || (args == null)) 
    { 
     throw new ArgumentNullException((format == null) ? "format" : "args"); 
    } 
    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8)); 
    builder.AppendFormat(provider, format, args); 
    return builder.ToString(); 
} 
11

बस एक विस्तार विधि पैदा करते हैं।

public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args) 
{ 
    builder.AppendFormat(format, args).AppendLine(); 
    return builder; 
} 

कारण मैं पसंद इस:

  • के रूप में ऊपर कहा गया है AppendLine(string.Format(...)) जितना भूमि के ऊपर कष्ट नहीं होता है,।
  • मुझे अंत में .AppendLine() भाग जोड़ने के लिए भूलने से रोकता है (अक्सर पर्याप्त होता है)।
  • अधिक पठनीय है (लेकिन यह एक राय है)।

यदि आपको इसे 'एपेंडलाइन' कहा जाता है, तो आप इसे 'AppendFormattedLine' या जो भी चाहें बदल सकते हैं।

var builder = new StringBuilder(); 

builder 
    .AppendLine("This is a test.") 
    .AppendLine("This is a {0}.", "test"); 

बस प्रत्येक अधिभार आप StringBuilder पर AppendFormat विधि का उपयोग करने के लिए इनमें से किसी एक को जोड़ने: मैं सब कुछ 'AppendLine' हालांकि करने के लिए अन्य कॉल के साथ अस्तर का आनंद लें।

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

  • कोई संबंधित समस्या नहीं^_^