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

Iam*_*per 34 c#

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

foreach(var a in collection)
{
  SomeClass sc = new SomeClass();
  sc.id = a;
  sc.Insert();
}
Run Code Online (Sandbox Code Playgroud)

要么

SomeClass sc = null;
foreach(var a in collection)
{
  sc = new SomeClass();
  sc.id = a;
  sc.Insert();
}
Run Code Online (Sandbox Code Playgroud)

哪个更好?

Mar*_*ers 67

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

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

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

  • +1 - 只应在需要的地方和时间声明对象.如果在for循环中需要int i,则在for循环内声明它而不是在函数体的顶部.请参阅代码完成:). (3认同)
  • 曾几何时,这两个循环之间产生的IL略有不同(与Java和C++相同),但不足以照顾.不确定当前的编译器是否已经改变了,或者CLR是否优化了额外的IL. (2认同)

Eri*_*ert 12

首先,我注意到当你说"创建对象"时,你的意思是"创建变量 ".对象引用放在变量中,但它们本身不是变量.

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

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

详情.