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.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...