.net - 当类没有实现 IEnumerable 时,GetEnumerator 方法是否应该仍然是幂等的

标签 .net ienumerable enumeration enumerable idempotent

这个问题是另一个 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/

相关文章:

c# - 从 Idisposable 实现泛型类时编译时的不同行为?

c# - 为什么使用 SerialPort.CatchReceivedEvents() 线程数不断增加

c# - 跨平台开发

c# - IEnumerable<T> 的扩展方法,返回 -this- 类型

iOS/Mac 操作系统 : Saving and comparing CGPoints/NSPoints in Arrays

c++ - 使用枚举的奇怪 SIGSEGV(段错误)

c# - 将 IDictionary<string, string> 键转换为小写 (C#)

c# - 无法将带有 [] 的索引应用于类型为“System.Collections.Generic.IEnumerable<>”的表达式

c# - Linq 查询 : where condition yields an empty sequence even if there should be one match

ios - 枚举对象并将其添加到 NSMutableSet 时的 exc_bad_access