वैचारिक रूप से, KeyValuePair<TKey,TValue>
चर का सिर्फ एक जोड़ी है, Key
और Value
। अगर माइक्रोसॉफ्ट ने इसे सार्वजनिक क्षेत्रों के Key
और Value
के साथ कार्यान्वित किया था, तो इसका अर्थशास्त्र सही होगा; जब ForEach
नियंत्रण चर के रूप में उपयोग किया जाता है तो यह अपरिवर्तनीय होता, लेकिन कोई अन्य को अद्यतन किए बिना सामान्य चर या सरणी तत्व की कुंजी या मान फ़ील्ड को अपडेट कर सकता था।
दुर्भाग्य से, माइक्रोसॉफ्ट के लिए तैयार नहीं किया गया है ढांचे प्रकार भी सार्वजनिक क्षेत्रों को दर्शाना, यहां तक कि KeyValuePair<TKey,TValue>
या Drawing.Rectangle
जिसका अर्थ विज्ञान हुक्म है कि (1) प्रकार एक struct होना चाहिए, जैसे प्रकार के लिए लगता है, (2) इसकी पूरी स्थिति गुणों के एक निश्चित सेट में दिखाई दे रही है (उन वस्तुओं के अलावा अन्य गणना गुण हो सकते हैं जो किसी ऑब्जेक्ट की स्थिति को परिभाषित करते हैं), और (3) उन गुणों को उनके प्रकार के लिए उपयुक्त मानों का कोई संयोजन सौंपा जा सकता है। नतीजतन, माइक्रोसॉफ्ट ने केवल 'राज्य को पढ़ने-योग्य गुणों के रूप में, या रीड-राइट गुणों के रूप में सदस्यों को उजागर करने की संभावनाओं पर विचार किया।पढ़ने-लिखने की संपत्तियों का उपयोग करना मतलब यह होगा कि कोड की तरह:
for each (var item in myDictionary)
item.Value += 1;
या
...assuming MyList is a List<Drawing.Rectangle>
MyList[3].Width += 9;
या तो
for each (var item in myDictionary)
{ var temp = item; temp .Value += 1; }
या
...assuming MyList is a List<Drawing.Rectangle>
{ temp = MyList[3]; temp.Width += 9; }
के रूप में मौजूदा सी # संकलक द्वारा व्याख्या की जाएगी
दोनों उपज भयानक बीहा vior जो लगभग निश्चित रूप से प्रोग्रामर इरादा नहीं है। .NET के कार्यान्वयनकर्ताओं ने निर्णय लिया कि KeyValuePair<TKey,TValue>
के सदस्यों को व्यक्तिगत रूप से उत्परिवर्तनीय होने का मूल्य पूर्व द्वारा उत्पन्न खतरे को न्यायसंगत नहीं ठहराया गया है, लेकिन Rectangle
के व्यक्तिगत सदस्यों को संशोधित करने की उपयोगिता दूसरे द्वारा उत्पन्न खतरे को न्यायसंगत साबित करने के लिए पर्याप्त थी। ध्यान दें कि किसी भी उदाहरण को किसी भी खतरे को उत्पन्न करने के लिए गुणों के बजाय उजागर क्षेत्रों का उपयोग नहीं किया जाना चाहिए था, क्योंकि अस्थायी संरचना के क्षेत्र में लिखने की अनुमति कभी भी स्वीकार्य नहीं थी, यहां तक कि संपत्ति सेटर्स को कॉल करते समय भी।
मैं 'टुपल 'का सुझाव दूंगा। एक बनाने का सबसे छोटा तरीका 'टुपल' होगा (मौजूदा वैल्यू.के, मौजूदा वैल्यू। वैल्यू + 1) '। यद्यपि एक वर्ग बनाना, यदि तार्किक है, तो अनावश्यक 'नया()' 'से बचने के लिए बेहतर होगा। – SimpleVar
@YoryeNathan: हाँ, यह संभवतः उचित होगा - या संपत्ति नामों के साथ एक अलग प्रकार जो 'बूल' और 'int' के वास्तविक अर्थ को दर्शाता है। (मुझे लगता है कि आपने इसके लिए भी अपनी टिप्पणी संपादित की है :) –
हां, हालांकि मैं उन मामलों की कल्पना कर सकता हूं जहां इसका उपयोग कुछ क्विर्की एल्गोरिदम के लिए एक छोटे से दायरे में किया जाएगा, इस मामले में मैं व्यक्तिगत रूप से एक अनाम प्रकार पसंद करूंगा। – SimpleVar