2009-11-10 9 views
63

की सामग्री को साफ़ करने का सबसे अच्छा तरीका मैं स्ट्रिंगबिल्डर का पुन: उपयोग करने के लिए सामग्री को साफ़ करने के लिए सबसे अच्छा तरीका (कम/कम संसाधनों का उपभोग करता है) पूछना चाहता हूं। इस परिदृश्य की कल्पना कीजिए:.NET के स्ट्रिंगबिल्डर

StringBuilder sb = new StringBuilder(); 
foreach(var whatever in whateverlist) 
{ 
    sb.Append("{0}", whatever); 
} 

//Perform some stuff with sb 

//Clear stringbuilder here 

//Populate stringbuilder again to perform more actions 
foreach(var whatever2 in whateverlist2) 
{ 
    sb.Append("{0}", whatever2); 
} 

और जब StringBuilder समाशोधन मैं दो संभावनाएं के बारे में सोच सकते हैं:

sb = new StringBuilder(); 

या

sb.Length = 0; 

यह स्पष्ट करने के लिए सबसे अच्छा तरीका है और यही कारण है क्या है?

धन्यवाद।

संपादित करें: मैं वर्तमान .NET 3.5 संस्करण के साथ मेल खाता हूं।

+4

में एक उत्तर, लेकिन पढ़ने के लिए दिलचस्प: http://bobondevelopment.com/2007/06/11/three-ways-to-clear-a-stringbuilder/ –

+1

StringBuilder.Clear() विधि को वैकल्पिक विकल्प के रूप में शामिल करने का कारण क्या है ? –

+0

@Rune: सी # 4.0 अभी तक बाहर नहीं है, यह केवल 4.0 में है। एमएसडीएन पर यह कहता है: इसमें समर्थित: 4. – jcollum

उत्तर

60

आप इस में .NET 2.0 या 3 कर रहे हैं।तब

/// <summary> 
///  Clears the contents of the string builder. 
/// </summary> 
/// <param name="value"> 
///  The <see cref="StringBuilder"/> to clear. 
/// </param> 
public static void Clear(this StringBuilder value) 
{ 
    value.Length = 0; 
    value.Capacity = 0; 
} 

, आप इसे इस तरह से साफ कर सकते हैं: 5, एक विस्तार विधि लिखना इस तरह यह करने के लिए

someStringBuilder.Clear(); 

तब, जब 4.0 बाहर आता है, आप पक्ष में अपने विस्तार विधि खाई सकते हैं 4.0 संस्करण का।

अद्यतन: क्षमता को शून्य पर सेट करना शायद एक अच्छा विचार नहीं है। यदि आप एक ही उदाहरण का पुन: उपयोग कर रहे हैं, तो जब आप बिल्डर को जोड़ते हैं तो वह पुनर्वितरण की गारंटी देगा। हालांकि, बिल्डर के उदाहरण में स्मृति तब तक जारी नहीं की जाती जब तक कि आप क्षमता को बहुत कम मूल्य (जैसे 1) पर सेट न करें। क्षमता संपत्ति का डिफ़ॉल्ट मान 16 है आप क्षमता दो बार की स्थापना 16 उपयोग करने पर विचार करना चाह सकते हैं, या (हालांकि यह कम कुशल है): 1 या शून्य करने के लिए स्मृति

  • सेट स्पष्ट करने के

    • सेट यह यह आपके मूल क्षमता मूल्य (जो 16 से भिन्न हो सकता है) को पुनर्स्थापित करने के लिए।
  • +0

    साफ विधि। मुझे इसकी ही खोज थी। – abhi

    +12

    मैं क्षमता को समाशोधन के खिलाफ अनुशंसा करता हूं, सिवाय इसके कि जब 'स्ट्रिंगबिल्डर' कुछ असामान्य * बड़ा होता है। विशेष रूप से .NET के पुराने संस्करणों में, यदि कोई बार-बार 42,500 से अधिक अक्षरों के तारों का निर्माण करेगा, तो प्रत्येक स्ट्रिंग के बाद बफर को साफ़ करने के बाद बफर को फिर से बढ़ने के लिए बड़े ऑब्जेक्ट हीप में अतिरिक्त ऑब्जेक्ट आवंटित किए जाएंगे। यह एक बुरी चीज है। – supercat

    +2

    क्षमता को 0 पर सेट करना एक दिलचस्प विचार है। जब केवल साफ़ या केवल लंबाई को 0 पर सेट करते समय, मेमोरी लीक तब हो सकती है जब सम्मिलित() बार-बार उपयोग किया जाता है, क्योंकि साफ़ होने के बावजूद क्षमता बढ़ती रहती है। (मेरा प्रश्न देखें: http://stackoverflow.com/questions/29574469/memory-leak-in-stringbuilder-when-using-insert-and-clear –

    15

    नई StringBuilder बनाएँ। पुराने एक है कि सबसे अच्छा सिर्फ कचरा दूर एकत्र कर रहे हैं (उदाहरण के लिए, अधिकतम लंबाई के बफर) इसके साथ जुड़े संसाधनों को बनाए रखता है।

    28

    .NET 4.0 में आप sb.Clear() पर कॉल कर सकते हैं लेकिन पुराने संस्करणों में आपको sb.Length = 0 सेट करना चाहिए।

    Clear() विधि .NET 4.0 में जोड़ा गया था।

    +1

    शून्य की क्षमता भी सेट करें ... –

    +12

    यदि आप पुन: उपयोग कर रहे हैं तो क्या आप बफर का पुन: उपयोग नहीं करना चाहेंगे? – GraemeF

    +2

    स्ट्रिंग की तुलना में दूसरी बार स्ट्रिंग की तुलना में पहली बार स्ट्रिंग कितनी बड़ी बनाई गई है, इस पर निर्भर करता है .. या कम से कम मुझे लगता है कि – Earlz

    10

    मुझे लगता है कि आप समय से पहले अनुकूलन कर रहे हैं।

    मैं शर्त लगाता हूं कि sb.Length=0; अन्य ऑब्जेक्ट बनाने और जीसी के अंततः एकत्र होने के लिए एक और ऑब्जेक्ट को अलग रखने के लिए सबसे तेज़ होगा।

    मुझे लगता है कि एक नया स्ट्रिंगबिल्डर बनाना स्मृति चिंताओं के लिए सबसे अच्छा शॉट होगा। और स्थापित करने sb.Length गति चिंताओं के लिए सबसे अच्छा शॉट ..

    10

    समुदाय सामग्री से पर MSDN होगा:

    प्रभावी रूप से यह उपयोग को नष्ट करने के बिना अपने stringbuilder हटाने के लिए:

    someStringBuilder.length = 0; 
    someStringBuilder.capacity = 0; 
    

    यह नष्ट कर देता है दोनों उसकी सामग्री और शून्य करने के लिए यह आकार बदलता है। स्पष्ट जैसा कि ऊपर बताया आकार छोटे अनुप्रयोगों को प्रभावित कर सकता।

    1

    मैं कहूंगा कि इसे साफ़ करने का सबसे अच्छा तरीका sb = new StringBuilder(); का उपयोग करना है। इसका अर्थ है कि मुझे लगता है कि यदि आप एक नया स्ट्रिंग बिल्डर पूरी तरह वस्तु बना दिया तो यह और भी बेहतर होगा।

    संपादित

    मुझे आशा है कि यह कह रही है कि यह सबसे अच्छा समाधान है बिना चला जाता है।

    public StringBuilder MakeString(IEnumerable<CoolType> list) 
    { 
        StringBuilder sb = new StringBuilder(); 
    
        foreach(var whatever in list) 
        { 
         sb.Append("{0}", whatever); 
        } 
    } 
    
    var sb = MakeString(whateverList); 
    // Do stuff 
    // Clear stuff 
    sb = MakeString(whateverList2); 
    
    +5

    एसबी = नया स्ट्रिंगबिल्डर() एक नई स्ट्रिंग बिल्डर ऑब्जेक्ट बना रहा है। –

    +0

    ऐसा करने से एक नई स्ट्रिंग बिल्डर ऑब्जेक्ट पूरी तरह से हो जाता है। –

    +0

    मुझे लगता है कि मैट का अर्थ है नए 'स्ट्रिंगबिल्डर' के लिए एक नया चर घोषित करें। –

    2

    आप स्मृति उपयोग को कम करने के लिए मैं कितना स्मृति अपने StringBuilder वस्तुओं तरीकों दूसरों के ऊपर का वर्णन किया है का उपयोग करते हुए उनके जीवन चक्र में उपयोग कर रहे हैं की जाँच करने के CLR प्रोफाइलर का प्रयोग करेंगे देख रहे हैं। फिर आप स्वयं को संतुष्ट कर सकते हैं कि आपके द्वारा चुने गए विकल्प आपकी आवश्यकताओं के लिए उपयुक्त हैं और संसाधनों को जारी कर रहे हैं जिनकी आपको आवश्यकता है।

    4

    .NET Framework 4 में StringBuilder कक्षा में नए तरीके पेश किए गए थे। विधि का नाम "साफ़ करें" है। यह विधि आपको StringBuilder ऑब्जेक्ट्स से मान या डेटा को साफ़ या निकालने में सहायता करती है।

    यहां इसके लिए उदाहरण है।

    System.Text.StringBuilder objSB = new System.Text.StringBuilder(); 
        //Append values 
        objSB.Append("This is .Net Blog."); 
        objSB.Append("You can get latest C# Tips over here."); 
    
        //Display on screen 
        Response.Write(objSB.ToString()); 
        Response.Write("<br/><br/>"); 
    
        //Clear object using Clear method 
        objSB.Clear(); 
    
        //Append another values 
        objSB.Append("This blog is very useful for .Net Beginners"); 
    
        Response.Write("After Clear<br/><br/>"); 
        //Display on screen 
        Response.Write(objSB.ToString()); 
    
    0

    बस फोन साफ़() विधि सिर्फ सेट लंबाई = 0, हम क्षमता = 0 भी, हम स्मृति को बचाने के लिए

    public StringBuilder Clear() { 
         this.Length = 0; 
         return this; 
    } 
    

    रेफरी चाहते हैं, तो सेट कर सकते हैं: नहीं referencesource.microsoft.com

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