我惊讶地看到了今天的下列行为:给出一堂课
class Foo
{
prop int FooNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和这段代码
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
Run Code Online (Sandbox Code Playgroud)
初始化foos
时new List<Foo>{ new Foo(), new Foo(), new Foo() }
使循环写入"555".
我的问题:为什么会发生这种情况,有没有办法绕过这个无需使用.ToList()
(需要评论,因为这里似乎不需要).
Jon*_*Jon 20
它发生的原因foos
是每次枚举它时都会动态生成.因此,在第一次迭代期间,您将在迭代结束后不再被任何引用的对象上设置属性值.第二次迭代适用于具有默认属性值的新构造对象.
初始化foos
为"持久"对象列表会改变事物,因为使用.ToList()
原因相同(构造"固定"列表并迭代两次;动态生成的原始列表IEnumerable
仅迭代一次).
在确定了应该使用.ToList()
在这里:总的来说,我不认为它需要一个评论,因为它不是习惯迭代不止一次动态生成的序列(相信很多代码分析工具警惕这一点),但通过各种手段做写一个.
归档时间: |
|
查看次数: |
234 次 |
最近记录: |