加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:22:46 所属栏目:百科 来源:网络整理
导读:假设我的Awesome类有一个属性Bazinga,它是一个默认值为“Default value”的String,我可以去: var enumerableOfAwesome = Enumerable .Range(1,5) .Select(n = new Awesome()); foreach (var a in enumerableOfAwesome) a.Bazinga = "New value"; 正如您可能
假设我的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)

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

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

解决方法

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读