C#8 सरणी-स्लाइसिंग सुविधा से नया हैट-ऑपरेटर इंडेक्स 0 पर शुरू क्यों नहीं होता है?



arrays indexing (1)

C # 8.0 स्लाइस सरण का एक सुविधाजनक तरीका पेश करता है - आधिकारिक C # 8.0 ब्लॉगपोस्ट देखें

किसी सरणी के अंतिम तत्व तक पहुंचने का सिंटैक्स है

int value[] = { 10, 11, 12, 13 };

int a = value[^1]; // 13
int b = value[^2]; // 12

मैं सोच रहा हूं कि तत्वों को पीछे की ओर ले जाने के लिए अनुक्रमण 0 के बजाय 1 पर क्यों शुरू होता है? क्या इसका कोई तकनीकी कारण है?


आधिकारिक जवाब

बेहतर दृश्यता के लिए, यहाँ Mads Torgersen की एक टिप्पणी है जो C # 8 ब्लॉग पोस्ट के इस डिज़ाइन निर्णय को समझाती है :

हमने पायथन का अनुसरण करने का फैसला किया जब यह शुरुआत से और अंत से अंकगणित की बात आती है। 0 पहले तत्व (हमेशा की तरह) को नामित करता है, और ^0 "लंबाई" तत्व, यानी अंत में एक सही। इस तरह से आपको एक साधारण रिश्ता मिलता है, जहां शुरुआत से ही एक तत्व की स्थिति और अंत से इसकी स्थिति लंबाई के बराबर होती है। यदि आप स्वयं गणित कर चुके हैं तो ^x x में ^x वह लंबाई है जिसे आप लंबाई से घटाएंगे।

नई टोपी ( ^ ) ऑपरेटर के बजाय माइनस ( - ) का उपयोग क्यों नहीं करें? यह मुख्य रूप से पर्वतमाला के साथ करना है। फिर से पायथन और अधिकांश उद्योग को ध्यान में रखते हुए, हम चाहते हैं कि हमारी रेंज शुरुआत में समावेशी हो, अंत में अनन्य हो। आप क्या कहते हैं कि सूचकांक एक सीमा के अंत तक सभी तरह से जाना चाहिए? C # में उत्तर सरल है: x..^0 x से अंत तक जाता है। पायथन में, कोई स्पष्ट सूचकांक नहीं है जो आप दे सकते हैं: -0 काम नहीं करता है, क्योंकि यह 0 बराबर है, पहला तत्व! तो पायथन में, आपको एक सीमा को व्यक्त करने के लिए पूरी तरह से अंत इंडेक्स को छोड़ना होगा जो अंत तक जाता है: x.. यदि सीमा के अंत की गणना की जाती है, तो आपको 0 आने वाले मामले में विशेष तर्क रखने के लिए याद रखना होगा। जैसे x..-y , जहाँ y की गणना की गई थी और 0 बाहर आया था। यह एक आम उपद्रव और कीड़े का स्रोत है।

अंत में, ध्यान दें कि सूचकांक और श्रेणियां .NET / C # में प्रथम श्रेणी के प्रकार हैं। उनका व्यवहार उस चीज़ से जुड़ा नहीं है जो उन्हें लागू किया जाता है, या यहां तक ​​कि एक अनुक्रमणिका में उपयोग किया जाता है। आप पूरी तरह से अपने खुद के इंडेक्सर को परिभाषित कर सकते हैं जो इंडेक्स लेता है और एक और जो Range लेता Range - और हम उदाहरण के लिए ऐसे इंडेक्स को जोड़ने वाले हैं। लेकिन आपके पास ऐसे तरीके भी हो सकते हैं जो उदाहरण के लिए रेंज लेते हैं।

मेरा जवाब

मुझे लगता है कि यह उस क्लासिक वाक्यविन्यास से मेल खाता है जिसका हम उपयोग करते हैं:

value[^1] == value[value.Length - 1]

यदि यह 0 का उपयोग करता है, तो यह भ्रामक होगा जब दो वाक्यविन्यासों का उपयोग साइड-बाय-साइड किया जाता है। इस तरह इसका संज्ञानात्मक भार कम होता है।

पायथन जैसी अन्य भाषाएं भी इसी सम्मेलन का उपयोग करती हैं।





c#-8.0