2009-02-18 13 views
7

जब मैं IEnumerable<T> इंटरफ़ेस को अनुकरण करता हूं तो मुझे दो GetEnumerator विधियां दिखाई देती हैं: एक xxx4 और अन्य IEnumerator<T> लौटाता है। मैं एक या दूसरे का उपयोग कब करूंगा?IENumerable <T> दो GetEnumerator विधियों को प्रदान करता है - उनके बीच क्या अंतर है?

उत्तर

8

आप IEnumerable<T> सामान्य इंटरफ़ेस कार्यान्वित कर रहे हैं, तो आप काफी हमेशा सामान्य GetEnumerator विधि का उपयोग करना होगा - जब तक आप (गैर सामान्य) IEnumerable स्पष्ट रूप से अपने वस्तु डाली।

कारण .NET 1.0/1.1 के साथ पिछड़ा संगतता है जो जेनेरिक का समर्थन नहीं करता है।

2

एक सामान्य है, दूसरा नहीं। मेरा मानना ​​है कि संकलक जेनेरिक अधिभार का उपयोग करना पसंद करता है।

4

आमतौर पर GetEnumerator()GetEnumerator<T>() कहता है, तो वहाँ व्यवहार में ज्यादा अंतर नहीं होना चाहिए। क्यों दो विधियां हैं, यह पिछली संगतता के लिए और स्थिति में उपयोग के लिए किया जाता है जहां T बहुत रुचि नहीं है (या केवल अज्ञात है)।

9

कारण वहाँ दो तरीके हैं क्योंकि 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(); 
    } 
} 
+0

+1 - ईआईएमआई = स्पष्ट इंटरफ़ेस सदस्य कार्यान्वयन –

+0

लेकिन पृथ्वी पर कैसे 'Foo: IEnumerable ' समझ में आता है? – nawfal

30

आप आम तौर पर दोनों को लागू:

यहां अपने प्रकार में इंटरफ़ेस को लागू करना चाहते हैं। एक नया, जेनेरिक संस्करण है जो टाइपएफ़ एन्युमेरेटर (IEnumerator<T>) देता है। दूसरा एक विरासत कोड के साथ संगतता के लिए है (IEnumerator देता है)। एक ठेठ दिया गया है:

public IEnumerator<T> GetEnumerator() { 
    foreach(T item in items) { 
     yield return item; 
    } 
} 

IEnumerator IEnumerable.GetEnumerator() { 
    return GetEnumerator(); 
} 
+0

इसने ने मुझे बहुत मदद की, नेस्टेड गणक के लिए अतिरिक्त श्रेणी से परहेज किया! –

+0

+1। मैं एक संदर्भ कार्यान्वयन खोजने के लिए भी गुगल रहा था जो नेस्टेड एन्यूमेरेटर क्लास से बचाता है और यह पहला जवाब था जो मैं आया था। –

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