string Name = "";
for(int i; i < 10; i++)
{
Name = NameList[i] + "what?";
Console.WriteLine(Name);
}
//Or this one:
for(int i; i < 10; i++)
{
string Name = NameList[i] + "what?";
Console.WriteLine(Name);
}
哪一个会少用内存?有人在这个问题的评论中问了这个,我不确定自己。谢谢!
答案 0 :(得分:7)
除了第一个片段中的初始分配外,两个片段都编译为相同的IL。
所需的内存是两个局部变量的内存,NameList
及其元素的内存,以及通过将列表元素与字符串常量连接而产生的10个字符串实例的内存。字符串实例最终将由GC以通常的,不可预测的方式收集。局部变量的范围对此没有影响。
答案 1 :(得分:0)
就实际“使用”内存而言,假设编译器没有将它们优化为同一个内容,第二个可能会使用更多内存,假设分配的内存在超出范围后不会立即进行垃圾回收
就处理步骤而言,再次假设编译器没有修复它,第二个将在每个循环中采取额外的步骤来为字符串分配内存。
我通常在我需要之前将变量分组声明,但我认为这很大程度上是因为使用较低级别的语言而留下的偏执行为。
在一个更大的函数中(我们知道应该避免),你在技术上会使用更多的内存来预先声明所有变量而不是根据需要(因为内存是立即使用的,而不是递增的)。为了更进一步,你将使用更多的内存将所有临时变量声明为成员变量(这是在方法开头声明它们的(il)逻辑扩展)因为它们被分配用于更长的寿命