2015-09-07 7 views
5

StringBuilder पर तार जोड़ते समय, इसकी क्षमता और लंबाई MaxCapacity से परे हो सकती है?स्ट्रिंगबिल्डर: क्या स्ट्रिंगबिल्डर की लंबाई और क्षमता इसकी अधिकतम क्षमता

एमएसडीएन मैक्स कैपेसिटी के अनुसार "अक्षरों की अधिकतम संख्या स्ट्रिंग बिल्डर इंस्टेंस होल्ड" के रूप में परिभाषित किया गया है। लेकिन इस व्यवहार दो कोड स्निपेट नीचे में असंगत है:

स्निपेट 1: नीचे कोड ArgumentOutOfRangeException में फेंक दिया जाता है जब StringBuilder की लंबाई अपनी MaxCapacity से अधिक है - यह अपेक्षा के अनुरूप है।

 String str = sb.ToString(); 

     StringBuilder sb1 = new StringBuilder(3, 5); 
     sb1.Append("1");  //no error as Length 1 <= max limit 5   
     sb1.Append("12");  //no error as Length 3 <= max limit 5   
     sb1.Append("123"); //ArgumentOutOfRangeException Thrown as Length 6 > max limit 5 

स्निपेट 2: नीचे कोड सं ArgumentOutOfRangeException में फेंक दिया जाता है जब StringBuilder की लंबाई अपनी MaxCapacity से अधिक है - यह व्यवहार गलत हो रहा है।

 StringBuilder sb = new StringBuilder(3, 5); 

     sb.Append("1"); //no error as Length 1 <= max limit 5   
     sb.Append("2"); //no error as Length 2 <= max limit 5   
     sb.Append("3"); //no error as Length 3 <= max limit 5   
     sb.Append("4"); //no error as Length 4 <= max limit 5   
     sb.Append("5"); //no error as Length 5 <= max limit 5   
     sb.Append("6"); //Even though Length 6 > max limit 5 NO EXCEPTION IS THROWN   

     String str = sb.ToString(); //Contains "123456" 

किसी को समझाने कृपया क्या इन दो मामलों में हो रहा है और यही कारण है कि व्यवहार में अंतर है?

+0

इस लिंक को चेक करें: https://msdn.microsoft।com/en-us/library/system.text.stringbuilder.maxcapacity (v = vs.110) .aspx –

+0

स्ट्रिंगबिल्डर क्षमता 0 से शुरू नहीं हो रही है। 0 + "1" + "12" + "123" = 6 – Gregg

+0

दिलचस्प। यदि आप 'स्ट्रिंगबिल्डर एसबी = नया स्ट्रिंगबिल्डर (0, 5) आज़माएं;', दूसरा नमूना फेंकता है। –

उत्तर

7

StringBuilder Constructor (Int32, Int32)

कॉलर्स के लिए नोट्स
.NET फ्रेमवर्क 4 और .NET फ्रेमवर्क 4.5 में, आप StringBuilder (Int32, Int32) पर कॉल करके StringBuilder वस्तु का दृष्टांत जब कन्स्ट्रक्टर, दोनों लंबाई और स्ट्रिंगबिल्डर उदाहरण की क्षमता के मैक्स कैपेसिटी प्रॉपर्टी के मूल्य से आगे बढ़ सकती है। यह विशेष रूप से तब हो सकता है जब आप छोटे स्ट्रिंग्स को जोड़ने के लिए एपेंड और एपेंडफॉर्मैट विधियों को कॉल करते हैं।

अतिरिक्त संसाधन: प्रदर्शन के कारणों के लिए और के रूप में

इस वर्ग लिखा है इस तरह से:

निष्कर्ष पर एक नज़र ले जा सकते हैं आधिकारिक दस्तावेजों में कहा गया है, इसकी Capacity और Length अपने MaxCapacity से आगे बढ़ सकते हैं विशेष रूप से छोटे तारों को जोड़ते समय।

  • यदि आप अपने ऐप की उम्मीद कब: इसके अलावा के रूप में दस्तावेजों में कहा गया है, मूलभूत मूल्यों के कुछ implementation-specific हैं और इसलिए ऐसा लगता है तो आप बेहतर Capacity और MaxCapacity पर भरोसा नहीं करते, और केवल प्रदर्शन के लिए इस वर्ग का उपयोग इन शर्तों के कारण डिज़ाइन समय पर एक स्ट्रिंग में अज्ञात संख्या में बदलाव करें (उदाहरण के लिए, जब आप उपयोगकर्ता इनपुट वाले तारों की यादृच्छिक संख्या को संयोजित करने के लिए लूप का उपयोग कर रहे हों)।
  • जब आप अपने ऐप को स्ट्रिंग में महत्वपूर्ण संख्या में परिवर्तन करने की अपेक्षा करते हैं।
+0

यह बहुत खराब है ... – Rawling

+0

मुझे लगता है कि अभ्यास में इसका क्या अर्थ है कि आप 'स्ट्रिंगबिल्डर' में शामिल हो सकते हैं जब तक कि वर्तमान 'लंबाई'' अधिकतम क्षमता 'से कम न हो। इसके लिए संभवतः एक अच्छा कारण था, यह देखते हुए कि यह संस्करण 4 में किया गया परिवर्तन था। – jmcilhinney

+0

@ हेनकहोल्टरमैन क्षमता पर अधिकतम सेट करें? – Rawling

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