2011-06-09 13 views
18

What's the rationale for null terminated strings? पढ़ने के बाद और कुछ समान प्रश्नों में मैंने पाया है कि सी #/नेट स्ट्रिंग्स आंतरिक रूप से हैं, दोनों लंबाई-पूर्वनिर्धारित और शून्य BSTR Data Type में समाप्त हो गई हैं।क्यों सी #/नेट स्ट्रिंग्स लम्बाई-प्रीफिक्स्ड और नल समाप्त हो गया है?

कारणों की वजह से स्ट्रिंग दोनों लंबाई-पूर्वनिर्धारित और शून्य समाप्त हो गई हैं। केवल लंबाई पूर्ववर्ती?

+2

शायद केवल @Eric Lippert इस का उत्तर देने में सक्षम होगा। एक या दूसरे (और व्यापार-बंद) करने के अच्छे कारण भी हैं। मैं आपको आश्चर्यचकित कर रहा हूं कि सी # ** ** ** दोनों है। – Yuck

+1

@ यक - या जॉन स्कीट – Xaisoft

उत्तर

21

लंबाई पूर्वनिर्धारित ताकि कंप्यूटिंग लंबाई O(1) हो।

नल को अप्रबंधित तेज तेज करने के लिए मार्शलिंग करने के लिए समाप्त कर दिया गया है (अप्रबंधित संभवतः शून्य-समाप्त तारों की अपेक्षा करता है)।

4

सबसे अधिक संभावना है, COM के साथ आसान अंतःक्रियाशीलता सुनिश्चित करने के लिए।

13

यहाँ एक अंश जॉन स्कीट ब्लॉग Post से तार के बारे में है:

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

0

सबसे अच्छा अनुमान यह है कि लंबाई (ओ (1) में चलने की तुलना में लम्बाई स्थिर (ओ (1)) ढूंढने की तुलना में स्थिर है (ओ (1))।

+0

लंबाई के साथ स्ट्रिंग को उपसर्ग करने के पीछे यही कारण है। यह अतिरिक्त रूप से समाप्ति वर्ण –

+1

@ डैनियल हिल्गार्थ का उपयोग करने का कोई कारण नहीं है: और मैंने अन्य उत्तरों को डुप्लिकेट क्यों नहीं किया। सवाल दोनों पक्षों से तर्क पूछता है। – leppie

+1

क्षमा करें, मुझे आपकी टिप्पणी समझ में नहीं आ रही है - फिर से आओ? प्रश्न पूछते हैं ** ** दोनों एक साथ ** का उपयोग करने का तर्क क्या है। और यह नहीं कि एक या दूसरे के लिए तर्क क्या है –

3

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

उदाहरण के लिए, Win32 API की तरह।

तो स्ट्रिंग डेटा के अंत में एक पूर्ण टर्मिनेटर रखना सुविधाजनक है क्योंकि इसे संभवतः वैसे भी वहां होने की आवश्यकता होगी।

ध्यान दें कि सी ++ की std::string कक्षा उसी तरह लागू की गई है (एमएसवीसी में वैसे भी)। इसी कारण से, मुझे यकीन है कि (c_str() अक्सर std::string को सी-स्टाइल स्ट्रिंग चाहता है जो कुछ पास करने के लिए प्रयोग किया जाता है)।

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