يوفر iEnumerable طريقتين من أساليب getenumerator - ما هو الفرق بينهما؟

StackOverflow https://stackoverflow.com/questions/560678

  •  05-09-2019
  •  | 
  •  

سؤال

عندما أنا emplement. IEnumerable<T> واجهة أرى اثنين GetEnumerator الأساليب: عودة واحدة IEnumerator وغيرها IEnumerator<T>. وبعد متى يمكنني استخدام واحد أو آخر؟

هل كانت مفيدة؟

المحلول

إذا كنت تنفذ IEnumerable<T> واجهة عامة، سوف تضطر دائما إلى استخدام طريقة Generic Getenumerator - إلا إذا قمت بإلقاء كائنك بشكل صريح إلى (غير عام) iEnumerable.

السبب يتوافق مع الوراء مع .NET 1.0 / 1.1 الذي لم يدعم الأطفال.

نصائح أخرى

عادة ما تنفذ على حد سواء. واحد هو النسخة الحديثة والأجنحة التي ترجع عداد المحاذاة (IEnumerator<T>). الآخر هو التوافق مع القانون القديم (العائدات IEnumerator). التنفيذ النموذجي هو:

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

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

السبب هناك طريقتان ل 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();
    }
}

مستخدم GetEnumerator() المكالمات GetEnumerator<T>(), ، لذلك لا ينبغي أن يكون هناك اختلاف كبير في السلوك. أما لماذا هناك طريقتان، يتم ذلك للتوافق مع الوراء واستخدامها في الموقف حيث T ليس من مصلحة كبيرة (أو غير معروف فقط).

واحد هو عام، والآخر لا. أعتقد أن المحول البرمجي يفضل استخدام الحمل العام العام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top