【发布时间】:2011-05-10 20:13:18
【问题描述】:
这个问题是我提出的另一个question的问题,它是关于通过在迭代对象时修改对象来滥用 IEnumerable 接口的。
普遍的共识是任何实现 IEnumerable 的东西都不应该是幂等的。但是 .net 支持使用 foreach 语句进行编译时鸭子类型。任何提供 IEnumerator GetEnumerator() 方法的对象都可以在 foreach 语句中使用。
那么GetEnumerator方法应该是幂等的还是实现IEnumerable的时候呢?
编辑(添加上下文)
为了说明这一点,我的建议是,在遍历队列时,每个项目都会随着它的进行而出队。此外,在调用 GetEnumerator 之后推入队列的任何新对象仍将被迭代。
【问题讨论】:
-
我不会将 GetEnumerator 添加到队列本身,而是定义一个函数
IEnumerable<T> DequeueOnEnumeration(),它可以像foreach(T elem in queue.DequeueOnEnumeration())一样使用。这样语义更加更清晰。
标签: .net ienumerable enumeration enumerable idempotent