هل يمكننا استخدام getEnumerator () دون استخدام واجهة ienumerable؟

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

  •  04-10-2019
  •  | 
  •  

سؤال

لدي فصل يسمى Primes وهذا الفصل ينفذ getEnumerator () دون تنفيذ واجهة iEnumerable.

public class Primes
{
    private long min;
    private long max;

    public Primes()
        : this(2, 100)
    {
    }

    public IEnumerator GetEnumerator()
    {...}

انا لم احصل عليها. هل فاتني شيء؟

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

المحلول

أولاً ، كما قال آخرون ، يمكنك تقديم أساليبك الخاصة دون تنفيذ واجهات على أي حال - يمكنك كتابة خاص بك Dispose الطريقة دون تنفيذ IDisposable وما إلى ذلك بالنسبة للواجهات المعروفة ، أقترح أن تكون هذه فكرة سيئة تقريبًا (لأن القراء سيكون لديهم توقعات معينة) ولكنها صالحة تمامًا.

الأهم من ذلك ، foreach بيان في ج# يستطيع العمل بدون IEnumerable كونه متورط مشترك. يقوم المترجم بفعالية بكتابة بطة وقت التجميع على الأسماء GetEnumerator(), Current و MoveNext(). كان هذا في المقام الأول للسماح بالتكرار القوي (وغير الملاكمة) في C# 1 ، قبل الأدوية. انظر القسم 8.8.4 من المواصفات C# 3 لمزيد من التفاصيل.

ومع ذلك ، من السيئ عمومًا القيام بذلك الآن إذا كنت فعل تريد أن تكون قادرًا على التكرار بسهولة على محتويات مثيل كمجموعة - وأنا أقترح بالفعل التنفيذ IEnumerable<T> بدلا من مجرد IEnumerable.

نصائح أخرى

نعم يمكنك. حتى يمكنك استخدامه في foreach. المشكلة الوحيدة التي لا يمكن إلقائها على المشكلة IEnumerable على الرغم من أنها تنفذ طريقة مطلوبة.

لا يوجد سبب لتنفيذك IEnumerable من أجل إنشاء وظيفة تسمى GetEnumerator هذا يعيد IEnumerator, ، هذا يعني فقط أنك لن تتمكن من توفير مثيل من هذا النوع إلى شيء يتوقع IEnumerable.

تضمن الواجهة عقدًا ، وهذا لا يعني أنه لا يمكن أن يكون لديك طريقة بنفس التوقيع مثل الواجهة في الواجهة على فئة لا تعرض الواجهة.

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