说我有一个类实现了 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的的类。这将需要存储状态(当前位置),其不是集合的一部分,但列举的方法的相当一部分。

你可能不需要编写课本。一个迭代方法可以返回 IEnumerable<T>, 所以如果你的班级仅需要实现 IEnumerable<T> 并没有别的,只是写一个迭代方法用于整个事情。

如果不,你必须坚持有一个外流,实现了 IEnumerable<T> 通过具有一个迭代方法来做 GetEnumerator, 然后你不必做任何事情非常困难的清理后的迭代。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top