जब मैं IEnumerable<T>
इंटरफ़ेस को अनुकरण करता हूं तो मुझे दो GetEnumerator
विधियां दिखाई देती हैं: एक xxx4 और अन्य IEnumerator<T>
लौटाता है। मैं एक या दूसरे का उपयोग कब करूंगा?IENumerable <T> दो GetEnumerator विधियों को प्रदान करता है - उनके बीच क्या अंतर है?
उत्तर
आप IEnumerable<T>
सामान्य इंटरफ़ेस कार्यान्वित कर रहे हैं, तो आप काफी हमेशा सामान्य GetEnumerator विधि का उपयोग करना होगा - जब तक आप (गैर सामान्य) IEnumerable स्पष्ट रूप से अपने वस्तु डाली।
कारण .NET 1.0/1.1 के साथ पिछड़ा संगतता है जो जेनेरिक का समर्थन नहीं करता है।
एक सामान्य है, दूसरा नहीं। मेरा मानना है कि संकलक जेनेरिक अधिभार का उपयोग करना पसंद करता है।
आमतौर पर GetEnumerator()
GetEnumerator<T>()
कहता है, तो वहाँ व्यवहार में ज्यादा अंतर नहीं होना चाहिए। क्यों दो विधियां हैं, यह पिछली संगतता के लिए और स्थिति में उपयोग के लिए किया जाता है जहां T
बहुत रुचि नहीं है (या केवल अज्ञात है)।
कारण वहाँ दो तरीके हैं क्योंकि IEnumerable<T>
IEnumerable
इंटरफ़ेस ताकि आप IEnumerable<T>
से सामान्य विधि और IEnumerable
से गैर सामान्य विधि को देख रहे हैं विरासत है।
class Foo : IEnumerable<Foo>
{
public IEnumerator<Foo> GetEnumerator()
{
// do your thing here
}
// do a EIMI here and simply call the generic method
IEnumerator IEnumerable.GetEnumerator()
{
this.GetEnumerator();
}
}
आप आम तौर पर दोनों को लागू:
यहां अपने प्रकार में इंटरफ़ेस को लागू करना चाहते हैं। एक नया, जेनेरिक संस्करण है जो टाइपएफ़ एन्युमेरेटर (IEnumerator<T>
) देता है। दूसरा एक विरासत कोड के साथ संगतता के लिए है (IEnumerator
देता है)। एक ठेठ दिया गया है:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
इसने ने मुझे बहुत मदद की, नेस्टेड गणक के लिए अतिरिक्त श्रेणी से परहेज किया! –
+1। मैं एक संदर्भ कार्यान्वयन खोजने के लिए भी गुगल रहा था जो नेस्टेड एन्यूमेरेटर क्लास से बचाता है और यह पहला जवाब था जो मैं आया था। –
+1 - ईआईएमआई = स्पष्ट इंटरफ़ेस सदस्य कार्यान्वयन –
लेकिन पृथ्वी पर कैसे 'Foo: IEnumerable' समझ में आता है? –
nawfal