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