首页 > 解决方案 > 在 .NET 中,为什么 IEnumerable 抽象存在,如果它只获取一个 IEnumerator 对象?

问题描述

为什么我需要 IEnumerable 作为抽象而不是“这就是它的设计方式”并且一切都在他们的签名中期待 IEnumerable?难道他们不能从 IEnumerator 开始并且从未使 IEnumerable 成为可能吗?

我已经阅读了各种 SO 问题,但我仍然不确定答案。这似乎是历史性的。我不是在问任何事情本身是如何工作的或如何迭代事物。我只是问为什么存在 IEnumerable 而不仅仅是 IEnumerator。为什么存在 IEnumerable的抽象?

如果我只能定义一个 GetEnumerator,为什么还要实现 IEnumerable(T)?

为什么我不能使用数组的枚举器,而不是自己实现呢?

任何人都可以向我解释 IEnumerable 和 IEnumerator 吗?

标签: .netdesign-patternsienumerableabstractionienumerator

解决方案


难道他们不能从 IEnumerator 开始并且从未使 IEnumerable 成为可能吗?

不,每次调用GetEnumerator()都是独立的,即

var iter1 = obj.GetEnumerator();
var iter2 = obj.GetEnumerator();
// now iter1 and iter2 can be advanced separately and
// have nothing to do with each-other, usually

在几乎所有情况下,这些单独的调用GetEnumerator()将来自不同的调用位置或可能来自不同的线程,但是:它们将单独报告。IEnumerable[<T>]API 只是宣传“有方法GetEnumerator()”。如果这里只有一个接口,那么当一个对象“是”(即实现该接口)时,除了冲突之外别无选择——您将永远无法在相同数据上获得单独的枚举数。


推荐阅读