创建for / foreach循环中使用的对象的最佳实践

时间:2010-03-15 13:38:22

标签: c#

处理for或foreach循环中的对象的最佳做法是什么?我们应该在循环外创建一个对象并重新创建它(使用new ...)或者为每个循环迭代创建一个新对象吗?
示例:

foreach(var a in collection)
{
  SomeClass sc = new SomeClass();
  sc.id = a;
  sc.Insert();
}

SomeClass sc = null;
foreach(var a in collection)
{
  sc = new SomeClass();
  sc.id = a;
  sc.Insert();
}

哪个更好?

7 个答案:

答案 0 :(得分:67)

第一种方法更好,因为它更清楚地传达了变量的预期范围,并防止错误意外地使用超出预期范围的对象。

想要使用第二种形式的一个原因是,如果你想要摆脱循环并仍然引用你在循环中最后到达的对象。

选择第二种形式的一个不好的理由是表现。乍一看,第二种方法可能使用较少的资源,或者您只创建一个对象并重复使用它。这不是这种情况。在循环内重复声明变量不会消耗任何额外的资源或时钟周期,因此在循环之外拔出声明不会获得任何性能优势。

答案 1 :(得分:12)

首先,我注意到当您说“创建对象”时,您的意思是“创建变量”。对象引用 in 变量,但它们本身不是变量。

请注意,当循环包含匿名函数且变量是匿名函数的封闭外部变量时,您描述的场景会引入语义差异。参见

http://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/

了解详情。

答案 2 :(得分:4)

我确信有人可能会推断出MSIL分析,但实际上在执行或性能方面没有明显差异。您唯一影响的是存储对象引用。

我说要保持干净简洁;在循环中声明变量。这在实践中提供了开放/封闭原则,因此您知道变量的使用范围,并且不会在其他地方重复使用。在下一个循环中,变量会丢失范围并自动重新初始化。

答案 3 :(得分:3)

在两种情况下,您都在每次循环迭代中创建一个新对象(因为您调用new SomeClass())。

前一种方法清楚地表明sc仅在循环中使用,从维护的角度来看这可能是一个优势。

答案 4 :(得分:1)

我认为这对性能无关紧要,但我更喜欢第一种。如果可能的话,我总是尽量保持声明和实例化。

答案 5 :(得分:1)

我会选择2来保持整洁,将所有声明保存在一个地方。 你可以这么说 “只应在需要的地方和时间宣布对象” 但你的循环可能是用它自己的小方法。

答案 6 :(得分:0)

我会使用第一个,但是对于编译器它是相同的,因为编译器从循环中移出变量声明。我打赌编译后的代码看起来像第二个。