我刚刚搬到的项目中有以下代码,它在我们的团队中提出了一个辩论:这是否是正确的方法:
public void Method()
{
var reusableList = new List<string>();
for (int i = 0; i < 100000000; i++)
{
var result = HelperMethod(i, reusableList);
}
}
private static object HelperMethod(int someObject, List<string> something)
{
something.Clear();
//do something with the list
something.Add(someObject.ToString());
return something[0];
}
方法“方法”运行循环处理一些数据使用辅助方法很多次(这里的代码当然不是真正的代码......)并且可重用的列表被传递给辅助方法以减少内存目的和性能目的。 “方法”方法中没有使用该列表(这会降低代码的可读性),但反复创建它会降低性能并增加内存消耗,这里最好的方法是什么?
答案 0 :(得分:0)
List<T>
在内部使用数组。如果将新项添加到列表中并且数组中没有剩余空间,则将分配双倍大小的新数组,并将当前数组中的所有对象复制到新数组。这需要一些时间。根据数组中的项目数量,这可能会产生影响。特别是在添加大量物品时。当像您一样使用列表的“共享”实例时,List<T>
的内部数组在调用List<T>.Clear()
时不会缩小。使用此实例一段时间后,您不再需要此开销。作为替代方案,当您期望列表中的大量项目时,您可以在构造函数中指定列表的初始容量。
这意味着:它在理论上更快。但我怀疑你是否真的认识到了这一点。
我更喜欢良好的代码可读性
答案 1 :(得分:0)
首先,Method()
循环不会一次又一次地执行for
。如果你在谈论HelperMethod()
那么,一遍又一遍地调用它将不会有任何内存问题,因为一旦执行它将创建它创建的所有资源(int and List<string>
)。