C#:在哪里实现自定义IEnumerator <t> </t>

时间:2009-10-03 13:24:11

标签: c# ienumerable ienumerator

假设我有一个实现IEnumerable<T>的类。它目前使用yield方法中的GetEnumerator()关键字。但是现在我需要做更多的事情,例如我想在自己之后进行清理。要做到这一点,除非我忽略了任何内容,否则我需要实现IEnumerator<T>接口。但是你会说我应该在那里做什么?

班级本身应该实施吗?GetEnumerator()是否会返回this?或者将它隐藏在私人课堂中会更好吗?或者它应该只是一个完全不同的类?对此有哪些常见做法?

3 个答案:

答案 0 :(得分:6)

如果您需要做的就是在枚举器被丢弃时清理一些资源,比如在foreach循环结束时,那么你可以用你拥有的东西来做,只需添加一个try / finally阻止你的迭代器方法。

像这样:

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

这就是它的全部内容。

答案 1 :(得分:2)

我会选择IEnumerator&lt; T&gt;的课程。这将需要存储不属于集合的状态(当前位置),而是存储枚举过程的一部分。

答案 2 :(得分:0)

您可能根本不需要为此编写课程。迭代器方法可以返回IEnumerable<T>,所以如果你的类只需要实现IEnumerable<T>而不需要其他东西,只需为整个事物编写一个迭代器方法。

如果没有,你必须坚持使用迭代器方法IEnumerable<T>实现GetEnumerator的外部类,那么你不必做任何非常难以清理的事情。迭代。

IEnumerator<T>来自IDisposable。迭代器方法通过执行Dispose块或最后finally之后的任何代码来实现yield return