जो मैंने पढ़ा है, उससे कुछ संग्रहों के एन्यूमरेटर प्रकारों के प्रदर्शन कारणों के संदर्भ संदर्भों के बजाय उत्परिवर्तनीय structs होने के लिए एक डिज़ाइन निर्णय लिया गया था। सूची। उपभोक्ता सबसे प्रसिद्ध है।सी # Arrays गणना के लिए संदर्भ प्रकार का उपयोग क्यों करते हैं, लेकिन सूची <T> एक परिवर्तनीय संरचना का उपयोग करता है?
मैं कुछ पुराने कोड की जांच कर रहा था जो सरणी का उपयोग करते थे, और यह आश्चर्यचकित हुआ कि सी # Arrays प्रकार के SZGenericArrayEnumerator को उनके जेनेरिक एन्यूमरेटर प्रकार के रूप में वापस लौटाते हैं, जो एक संदर्भ प्रकार है।
मुझे आश्चर्य है कि अगर कोई जानता है कि क्यों ऐरे के जेनेरिक इटरेटर को संदर्भ प्रकार के रूप में लागू किया गया था, तो कई अन्य प्रदर्शन महत्वपूर्ण संग्रहों ने इसके बजाय उत्परिवर्तनीय structs का उपयोग किया।
LINQ के प्रसार (और अभिव्यक्तित्मक शक्ति) को देखते हुए, गणकों को अक्सर सरणी के लिए पुनर्प्राप्त किया जा रहा है। उदाहरण, कई गुणों/विधियों के लिए .NET रिटर्न सरणी में प्रतिबिंब वर्ग - और LINQ डब्ल्यू/प्रतिबिंब का उपयोग काफी आसान है। मेरे ज्ञान के लिए, अधिकांश LINQ ऑपरेटर यह निर्धारित करने के लिए विशेष केस चेक नहीं करते हैं कि क्या IENumerable <> वे वास्तव में एक सरणी हैं। – LBushkin
@LBushkin: सही। यदि आप आवंटित ढेर की लागत लेने के लिए तैयार नहीं हैं और फिर कचरा * * गणनाकर्ता * इकट्ठा कर रहे हैं तो आप संभावित रूप से ढेर आवंटन और कचरा इकट्ठा करने की लागत * क्वेरी *, और इसके द्वारा बनाई गई सभी गणनाकर्ता वस्तुओं की लागत को लेने के लिए अनिच्छुक रूप से अनिच्छुक हैं , और आपके द्वारा बनाए जाने वाले सभी प्रतिनिधियों को। उस क्वेरी को कॉल करने के सभी ओवरहेड का उल्लेख नहीं करना (सही होने के लिए तर्क जांचना, और इसी तरह)। वस्तुओं के लिए LINQ उचित रूप से प्रदर्शन करने वाला है लेकिन यह निश्चित रूप से ढेर आवंटन को कम करने के लिए डिज़ाइन नहीं किया गया था! LINQ जगह पर ढेर स्मृति आवंटित करता है। –
एक अन्य कारक, मुझे संदेह है कि मूल 'सूची' के लिए गणनाकर्ता जेनेरिक से पहले के दिनों में डिजाइन किया गया था। 'List.Enumerator' की संरचना-नस्ल केवल तीन प्रकार के कोड को प्रभावित करती है: कोड जो स्पष्ट रूप से' List.Enumerator' प्रकार का उपयोग करता है, कोड जो 'जेन्यूमेरेबल' से बाध्य एक सामान्य पैरामीटर स्वीकार करता है, या कोड जो 'var' का उपयोग करने के लिए' var' का उपयोग करता है चर जो एक सूची के गणनाकर्ता होगा। यदि कोई प्रोग्रामर 'List.Enumerator' निर्दिष्ट करने जा रहा है, तो प्रोग्रामर को पता होना चाहिए कि वह क्या कर रहा है। अन्य दो प्रकार के कोड के लिए, जब वे 'List.Enumerator' डिज़ाइन किया गया था तब वे अस्तित्व में नहीं थे। – supercat