这个问题是另一个 question 的问题我提出了关于通过在迭代对象时修改对象来滥用 IEnumerable 接口(interface)。
普遍的共识是任何实现 IEnumerable 的东西都不应该是幂等的。但是 .net 支持使用 foreach 语句的编译时鸭子类型。任何提供 IEnumerator GetEnumerator() 方法的对象都可以在 foreach 语句中使用。
那么 GetEnumerator 方法应该是幂等的还是在实现 IEnumerable 时是幂等的?
编辑(添加上下文)
为了说明这一点,我的建议是,当遍历队列时,每个项目都会随着它的移动而出队。此外,在调用 GetEnumerator 之后推送到队列中的任何新对象仍将被迭代。
最佳答案
幂等的不是类型——这甚至没有多大意义;您可能的意思是不可变的,但这并不清楚。 GetEnumerator
方法本身通常是幂等的。
虽然我会说通常是这种情况,但我可以设想一些特殊情况,在这种情况下使用非幂等GetEnumerator
方法是有意义的。例如,可能是您获得了只能读取一次的数据(因为它是从不会再次为相同请求提供服务的网络服务器流式传输的,或类似的东西)。在这种情况下,GetEnumerator
必须有效地使数据源无效,以便以后的调用会抛出异常。
当然,应该非常仔细地记录此类类型和方法,但我认为它们是合理的。
关于.net - 当类没有实现 IEnumerable 时,GetEnumerator 方法是否应该仍然是幂等的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194900/