StringBuilder.Capacity
बिना अशक्त समाप्ति के संबंध नेट वर्णों की अधिकतम संख्या को सेट किए जाने चाहिए, है, या यह जब पी का उपयोग कर/आह्वान एक अशक्त टर्मिनेटर के लिए स्थान आरक्षित करने के लिए एक उच्च सेट होना चाहिए।पी/Invoke का उपयोग करते समय StringBuilder.Capacity सेट करने का सही तरीका क्या है?
प्राकृतिक प्रतिक्रिया यह एक उच्च सेट किया जाना चाहिए कि है, लेकिन यह पी/आह्वान की तरह लगता है स्वचालित रूप से क्षतिपूर्ति करने के लिए माना जाता है। असल में यह वास्तव में यहां दस्तावेज किया गया है: http://msdn.microsoft.com/en-US/library/s9ts558h(v=VS.100).aspx
इस प्रश्न का कारण यह है कि अधिकांश उदाहरण उपर्युक्त दस्तावेज़ीकरण के साथ सख्ती से संगत नहीं हैं। लगभग हमेशा वे कोडित रहे हैं:
StringBuilder sb = new StringBuilder(dotNetChars + 1);
SomeWindowsAPI(sb, sb.Capacity);
बजाय:
StringBuilder sb = new StringBuilder(dotNetChars);
SomeWindowsAPI(sb, sb.Capacity + 1);
(मुझे लगता है कि कुछ APIs बफर आकार पैरामीटर अलग ढंग से संभाल मान लें कि एपीआई इस जरूरी आम तरीका संभालती है, GetFullPathName
की तरह।: http://msdn.microsoft.com/en-us/library/aa364963(v=VS.85).aspx)
एपीआई कॉल में सीधे sb.Capacity
के साथ एक अभिव्यक्ति का उपयोग करना एक मेल खाने से बचने के लिए एक सर्वोत्तम अभ्यास प्रतीत होता है। मुद्दा यह है कि +1 जोड़ना सही है या नहीं।
चारों ओर देखो। आपको शायद पता चलेगा कि sb.Capacity + 1
दिखाए जाने वाला एकमात्र स्थान एमएसडीएन दस्तावेज है।
, एक एक बड़ा बफर के साथ सावधानी के मामले में आवंटित कर सकते हैं की तुलना में अत्यंत आवश्यक होता है, लेकिन मैं ऐसा करने के तरीके पर आम सहमति जानना चाहूंगा।
लेकिन पी/Invoke इस के साथ क्या करता है? यदि पी/Invoke केवल उस सरणी में पहले अक्षर के पते को बाहरी फ़ंक्शन पर पास करता है, तो शून्य शून्य टर्मिनेटर के लिए 1 छोटा है। –
स्ट्रिंग्स को पिनवोक के लिए मार्शल किया गया है और '\ 0' जोड़ने जैसी चीजें ढांचे द्वारा स्वचालित रूप से की जाती हैं। मेरा मानना है कि इस उदाहरण में, आपको इसे ध्यान में रखना नहीं है। –