假设我有一个实现IEnumerable<T>
. 它目前在方法中使用yield
关键字。GetEnumerator()
但是现在我需要做更多的事情,例如我想自己清理一下。为此,除非我忽略了任何东西,否则我需要实现IEnumerator<T>
接口。但是你说我应该在哪里做呢?
类本身是否应该实现它并GetEnumerator()
返回this
?还是将其隐藏在私人课程中会更好?还是应该只是一个完全不同的班级?对此有哪些常见做法?
假设我有一个实现IEnumerable<T>
. 它目前在方法中使用yield
关键字。GetEnumerator()
但是现在我需要做更多的事情,例如我想自己清理一下。为此,除非我忽略了任何东西,否则我需要实现IEnumerator<T>
接口。但是你说我应该在哪里做呢?
类本身是否应该实现它并GetEnumerator()
返回this
?还是将其隐藏在私人课程中会更好?还是应该只是一个完全不同的班级?对此有哪些常见做法?
如果您需要做的只是在处理枚举器时(例如在循环结束时)清理一些资源foreach
,那么您可以使用您所拥有的来执行此操作,只需在您的迭代器方法中添加一个 try/finally 块。
像这样:
public IEnumerator<T> GetEnumerator()
{
try
{
// your iterator code here
}
finally
{
// cleanup code here
}
}
这里的所有都是它的。
我会选择 IEnumerator<T> 的课程。这将需要存储不属于集合的状态(当前位置),而是枚举过程的一部分。
您可能根本不需要为此编写课程。一个迭代器方法可以返回IEnumerable<T>
,所以如果你的类只需要实现而不需要IEnumerable<T>
其他,只需为整个事情编写一个迭代器方法。
如果没有,并且您必须坚持使用IEnumerable<T>
通过迭代器方法来实现的外部类 do GetEnumerator
,那么您不必在迭代后做任何难以清理的事情。
IEnumerator<T>
源自IDisposable
。迭代器方法Dispose
通过执行finally
块或最后一个之后的任何代码来实现yield return
。