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

前端之家收集整理的这篇文章主要介绍了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.

猜你在找的C#相关文章