سؤال

قل لدي فئة تنفذ IEnumerable<T>. وبعد يستخدم حاليا yield الكلمة الرئيسية في GetEnumerator() طريقة. ولكن الآن أحتاج إلى القيام أكثر قليلا، على سبيل المثال، أود التنظيف بعد نفسي. للقيام بذلك، ما لم أطلت أي شيء، أحتاج إلى تنفيذ IEnumerator<T> واجهه المستخدم. ولكن أين تقول يجب أن أفعل ذلك؟

يجب أن تنفذ الطبقة نفسها و GetEnumerator() إرجاع thisب أو سيكون من الأفضل إخفاءها في فئة خاصة؟ أو يجب أن تكون فقط فئة مختلفة تماما؟ ما هي بعض الممارسات الشائعة لهذا؟

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

المحلول

إذا كان كل ما عليك فعله هو تنظيف بعض الموارد عند التخلص من العداد، مثل في نهاية أ foreach حلقة، ثم يمكنك القيام بذلك مع ما لديك، ما عليك سوى إضافة تجربة / حظر أخيرا إلى طريقة ITERATOR الخاصة بك.

مثله:

public IEnumerator<T> GetEnumerator()
{
    try
    {
        // your iterator code here
    }
    finally
    {
        // cleanup code here
    }
}

هذا كل ما في الامر.

نصائح أخرى

سأذهب مع فئة للأجهزة ienumeratoru003CT> وبعد سيحتاج ذلك إلى تخزين الحالة (الموقع الحالي) الذي ليس جزءا من المجموعة، بل جزءا من عملية التعداد.

قد لا تحتاج إلى كتابة فئة لهذا على الإطلاق. يمكن أن تعود طريقة ITERATOR IEnumerable<T>, ، لذلك إذا كان منصمك يحتاج فقط إلى التنفيذ IEnumerable<T> ولا شيء آخر، ما عليك سوى كتابة طريقة للمكترونات في كل شيء.

إذا لم يكن كذلك، وعليك التمسك فئة خارجية تنفذ IEnumerable<T> من خلال وجود طريقة للمكترونات للقيام به GetEnumerator, ، ثم ليس عليك القيام بأي شيء يصعب تنظيفه بعد التكرار.

IEnumerator<T> مستمد من IDisposable. وبعد تنفذ طريقة ماء المؤتمر Dispose عن طريق التنفيذ finally كتل أو أي رمز بعد الأخير yield return.

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