假设我有一个实现IEnumerable<T>
的类。它目前使用yield
方法中的GetEnumerator()
关键字。但是现在我需要做更多的事情,例如我想在自己之后进行清理。要做到这一点,除非我忽略了任何内容,否则我需要实现IEnumerator<T>
接口。但是你会说我应该在那里做什么?
班级本身应该实施吗?GetEnumerator()
是否会返回this
?或者将它隐藏在私人课堂中会更好吗?或者它应该只是一个完全不同的类?对此有哪些常见做法?
答案 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
。