【发布时间】:2015-06-02 23:40:44
【问题描述】:
假设我的Awesome 类有一个属性Bazinga,这是一个默认值为“默认值”的String,我可以去:
var enumerableOfAwesome = Enumerable
.Range(1, 5)
.Select(n => new Awesome());
foreach (var a in enumerableOfAwesome)
a.Bazinga = "New value";
您可能已经知道,如果您希望在所有 Bazinga 中安全地找到您的“新值”字符串,那么再次枚举 enumerableOfAwesome 不会让您感到高兴。相反,将它们输出到控制台会呈现:
默认值
默认值
默认值
默认值
默认值
从某些延迟执行的角度来看,这一切都很好,而且这个问题之前已经讨论过,比如here 和here。然而,我的问题是为什么枚举器实现不返回不可变对象;如果不能保证多次枚举的持久性,那么设置值的能力有什么用,除了让人困惑吗?
也许这不是一个很好的问题,但我相信你的回答会很有启发性。
【问题讨论】:
-
ToList() 或 ToArray() 在这种情况下是你的朋友。了解他们的工作可能会帮助您了解正在发生的事情。
-
因为 C# 中没有神奇的不变性包装器,所以枚举只是返回一个定义其自身状态和可变性的类型的实例。
-
LINQ 查询实际上只是一组指令,它们定义了应该在某个集合上执行什么以及返回一个新集合。如果您执行两次,您将对集合执行两次指令——就是这样。如果您不将这些结果存储在集合中并使用该集合,您将从同一点开始两次。