创build用于for / foreach循环的对象的最佳实践
在for或foreach循环中处理对象的最佳做法是什么? 我们是否应该在循环之外创build一个对象并重新创build它(使用new …)或为每个循环迭代创build一个新对象?
例:
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(); }
哪个更好?
第一种方法更好,因为它更清楚地expression了variables的预期范围,并防止意外地使用超出预期范围的对象的错误。
想要使用第二种forms的一个原因是,如果你想跳出循环,仍然有一个你最后到达的循环中的对象的引用。
select第二种forms的一个坏的理由是performance。 乍一看,第二种方法使用较less的资源,或者您只创build一个对象并重用它。 这不是这种情况。 循环内重复声明一个variables不会消耗任何额外的资源或时钟周期,因此您不会从循环外部获取任何性能优势。
首先,我注意到当你说“创build对象”时,你的意思是“创buildvariables ”。 对象引用进入variables,但它们本身不是variables。
请注意,您所描述的场景在循环包含匿名函数并且variables是匿名函数的封闭外部variables时会引入语义差异。 看到
http://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/
了解详情。
我相信有人可能会抨击MSIL分析,但实际上在执行或性能方面没有明显的差别。 你唯一影响的是存储一个对象引用。
我说保持干净简单; 在循环中声明variables。 这在实践中提供了开放/closures的原则,所以你知道variables被使用的范围,并且不会在其他地方重复使用。 在下一个循环中,variables将丢失范围并自动重新初始化。
在这两种情况下,您都在每次循环迭代中创build一个新对象(因为您调用了new SomeClass()
)。
前一种方法清楚地表明, sc
仅用于循环内部,从维护的angular度来看这可能是一个优点。
我认为这对性能没有任何影响,但我更喜欢第一个。 如果可能,我总是尽量保持声明和实例化。
我会select2来整理,把所有的声明保存在一个地方。 你可能会说“对象只能在需要的时间和地点进行声明”,但是你的循环可能会用它自己的方法。
我会使用第一个,但编译器是相同的,因为编译器从循环中移出variables的声明。 我在编译代码后打赌看起来像第二个。