2

假设我有一个实现IEnumerable<T>. 它目前在方法中使用yield关键字。GetEnumerator()但是现在我需要做更多的事情,例如我想自己清理一下。为此,除非我忽略了任何东西,否则我需要实现IEnumerator<T>接口。但是你说我应该在哪里做呢?

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

4

3 回答 3

6

如果您需要做的只是在处理枚举器时(例如在循环结束时)清理一些资源foreach,那么您可以使用您所拥有的来执行此操作,只需在您的迭代器方法中添加一个 try/finally 块。

像这样:

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

这里的所有都是它的。

于 2009-10-03T13:28:09.663 回答
2

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

于 2009-10-03T13:27:56.063 回答
0

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

如果没有,并且您必须坚持使用IEnumerable<T>通过迭代器方法来实现的外部类 do GetEnumerator,那么您不必在迭代后做任何难以清理的事情。

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

于 2009-10-03T13:33:32.370 回答