c# – 为什么IEnumerable预测不可变?

假设我的Awesome类有一个属性Bazinga,它是一个认值为“Default value”的String,我可以去:
var enumerableOfAwesome = Enumerable
        .Range(1,5)
        .Select(n => new Awesome());

    foreach (var a in enumerableOfAwesome)
        a.Bazinga = "New value";

正如您可能已经知道的那样,如果您希望在所有Bazinga中安全地找到您的“新值”字符串,那么再次枚举enumerableOfAwesome将不会让您满意.相反,将它们输出到控制台将呈现:

Default value
Default value
Default value
Default value
Default value

(.NET Fiddle here)

从一些延迟执行的观点来看,这一切都很好,而且之前已经讨论过这个问题,比如herehere.我的问题是为什么枚举器实现不返回不可变对象;如果不能保证几个枚举的持久性,那么设置值的能力有什么用,除了让人们感到困惑?

也许这不是一个很好的问题,但我相信你的答案会很有启发性.

解决方法

My question however is why the enumerator implementations do not return immutable objects

你怎么期望他们这样做?它们是所使用的任何类型的序列 – 你会发生什么样的事情:

var builders = new string[] { "foo","bar" }.Select(x => new StringBuilder(x));

?你期望它(在这种情况下是什么“它”)使用与StringBuilder相同的API自动创建一个新类型,但神奇地使它不可变?它如何检测突变?

基本上,你所要求的是不可行的 – 你可以有一个元素类型是可变的序列,所以在迭代它时你可以改变所产生的引用引用的对象.期待其他任何事都是不现实的,IMO.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么