这可能是一个愚蠢的问题,但......
重构我的代码,我想出了一个我找不到任何答案的问题:
假设我有一个包含字符串属性MyDumyObject
和Foo
的对象Bar
假设我还有一个名为MyDumyObject
MyDumyCollection
集合
是
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
obj.Bar = "baaaaaaaar";
}
相当于
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
}
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Bar = "baaaaaaaar";
}
我在猜测:不 但我被C#和C#编译器以前的工作方式多次欺骗了,所以我现在对我的假设很谨慎,我很乐意得到确认或反驳。
附属问题:
是
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
// ....
obj.Foo = "foooooooooooooooooooooooo";
}
相当于
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
}
// ....
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "foooooooooooooooooooooooo";
}
答案 0 :(得分:10)
是两个比一个更昂贵的循环 环
假设循环语句中的代码比循环开销本身要昂贵得多,它应该没关系 - 但在你的情况下,开销似乎更重要,所以是两个循环更昂贵。对于每个循环,必须生成一个Enumerator,并且您必须为集合中的每个项目前进到枚举中的下一个项目(即使对于列表,这是一个简单的索引访问[]
) - 有两个循环你有这个开销两次。
另外请记住,有些枚举不能迭代两次,因为迭代时会消耗数据,即从网络接收的数据,但这些情况介于两者之间 - 对于内存中的集合(如{{ 1}})这通常不适用。
一般来说,可读性与微优化相比 - 我并不认为循环开销在很多方面都很重要。
答案 1 :(得分:1)
你也可以问一个循环是否有任何开销。它可能没有太大的开销,但如果它有任何开销,那么两个循环会有更多。
答案 2 :(得分:1)
关于你的附属问题,它实际上归结为省略号中发生的事情。如果你在你设置它的点之间引用了obj.Foo的值 - 或者在YourDummyCollection中的任何obj的Foo,那么双循环场景可能会产生不同的结果。比方说,例如,你在循环中有一个调用再次循环集合,添加所有Foos的长度。最后一次通过循环,它将拥有所有“foooooooooooooooooooooooo”除了一个 - 但如果你将第二个赋值分离到它自己的循环中,它将全部是“fooooooooo”。完全不同。