假设我正在使用
遍历列表或数据读取器foreach(var v in _list)
{
....stuff
}
或
while(_reader.Read())
{
....stuff
}
我想创建一个新的对象实例,仅在每次迭代中使用(例如,每次迭代时必须使用列表或读取器中的值填充的对象),如果我在进入循环之前创建对象,赋值等,然后在下一次迭代之前使对象为空,或者在每次迭代时创建一个新对象?
答案 0 :(得分:6)
我应该在进入循环之前创建对象并分配值等,然后在下一次迭代之前使对象为空,或者在每次迭代时创建一个新对象?
如果仅在循环体内需要对象,则在循环体的范围内创建它。无需在引用范围之外声明对象。垃圾收集器处理这些对象非常有效。
没有必要废除任何东西。
答案 1 :(得分:2)
我个人会在每次迭代时分配一个新对象。我怀疑这些方法会导致不同的IL,因为纯粹根据我的观察结果,你最终会重新使用相同的内存块,并且所有有效发生的事情都是每次迭代都将这些位设置为0。所以为了清洁代码,我只想写;
foreach(var v in _list)
{
MyReferenceType temp = new MyReferenceType();
// do stuff with temp object
// object goes out of scope here and same memory will be reused
// when we get back to the first statement in the loop
}