Dav*_*vid 0 .net c# optimization refactoring
这可能是一个愚蠢的问题,但......
重构我的代码,我想出了一个我找不到任何答案的问题:
假设我有一个对象MyDumyObject包含字符串的属性Foo和Bar
假设我也有一个MyDumyObject叫做的集合MyDumyCollection
是
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
obj.Bar = "baaaaaaaar";
}
Run Code Online (Sandbox Code Playgroud)
相当于
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
}
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Bar = "baaaaaaaar";
}
Run Code Online (Sandbox Code Playgroud)
?
我猜:没有,但我被C#和C#编译器以前的工作方式多次欺骗了,所以我现在对我的假设很谨慎,我很高兴得到确认或反驳.
附属问题:
是
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
// ....
obj.Foo = "foooooooooooooooooooooooo";
}
Run Code Online (Sandbox Code Playgroud)
相当于
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "fooooooooo";
}
// ....
foreach(MyDumyObject obj in MyDumyCollection)
{
obj.Foo = "foooooooooooooooooooooooo";
}
Run Code Online (Sandbox Code Playgroud)
?
Bro*_*ass 10
两个循环比一个循环更昂贵
假设循环语句中的代码比循环开销本身要昂贵得多,那应该没关系 - 但在你的情况下,开销似乎更重要,所以是两个循环更昂贵.对于每个循环,必须生成一个Enumerator,你必须为集合中的每个项目前进到枚举中的下一个项目(即使对于列表,这是一个简单的索引访问[]) - 有两个循环,你有这个开销两次.
还要记住有些枚举,你不能迭代两次,因为迭代时会消耗数据,即从网络接收的数据,但这些情况很远,介于两者之间 - 对于内存中的集合(如List<T>),这通常不会应用.
一般来说,可读性与微优化相比 - 我并不认为循环开销在很多方面都很重要.