يوفر iEnumerable طريقتين من أساليب getenumerator - ما هو الفرق بينهما؟
-
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
ليس من مصلحة كبيرة (أو غير معروف فقط).
واحد هو عام، والآخر لا. أعتقد أن المحول البرمجي يفضل استخدام الحمل العام العام.