gpt4 book ai didi

c# - 更改 IEnumerator.Current 的属性

转载 作者:可可西里 更新时间:2023-11-01 08:55:52 25 4
gpt4 key购买 nike

今天我很惊讶地观察到以下行为:给定一个类

class Foo
{
prop int FooNumber { get; set; }
}

和这段代码

IEnumerable<Foo> foos = Enumerable.Range(0,3).Select(new Foo());

foreach (var foo in foos)
foo.Bar = 5;

foreach (var foo in foos)
Console.Write(foo.Bar); // Writes 000

初始化时foosnew List<Foo>{ new Foo(), new Foo(), new Foo() }使循环写入“555”。

我的问题:为什么会发生这种情况,有没有办法在不使用 .ToList() 的情况下避免这种情况? (需要注释,因为这里似乎不需要)。

最佳答案

发生这种情况是因为 foos 是在您每次枚举它时动态生成的。因此,在第一次迭代期间,您将在迭代结束后不再被任何对象引用的对象上设置属性值。第二次迭代适用于具有默认属性值的新构建对象。

foos 初始化为“持久”对象列表会改变一些事情,就像使用 .ToList() 一样出于同样的原因(构建“固定”列表并迭代两次;原始动态生成的 IEnumerable 仅迭代一次)。

已经确定您应该在此处使用 .ToList():一般来说,我不认为它需要注释,因为通常不习惯迭代动态生成的sequences 不止一次(我相信许多代码分析工具都警告不要这样做),但一定要写一个。

关于c# - 更改 IEnumerator<T>.Current 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11411122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com