C# 这两个代码段中哪一个使用了更多内存? string Name=”“; for(int i;i

C# 这两个代码段中哪一个使用了更多内存? string Name=”“; for(int i;i,c#,C#,哪一个会占用更少的内存?有人在这个问题的评论中问了这个问题,我自己也不确定。谢谢 除了第一个代码段中的初始赋值,两个代码段都编译为相同的IL 所需的内存是两个局部变量的内存,NameList及其元素的内存,以及10个字符串实例的内存,这些字符串实例是通过将列表元素与字符串常量连接而得到的。字符串实例最终将由GC以通常的、不可预测的方式收集。局部变量的作用域对此没有影响。就实际的“已使用”内存而言,假设编译器没有将它们优化为相同的内容,第二个可能会使用更多内存,假设分配的内存在超出作用域后不会立即

哪一个会占用更少的内存?有人在这个问题的评论中问了这个问题,我自己也不确定。谢谢


除了第一个代码段中的初始赋值,两个代码段都编译为相同的IL

所需的内存是两个局部变量的内存,
NameList
及其元素的内存,以及10个字符串实例的内存,这些字符串实例是通过将列表元素与字符串常量连接而得到的。字符串实例最终将由GC以通常的、不可预测的方式收集。局部变量的作用域对此没有影响。

就实际的“已使用”内存而言,假设编译器没有将它们优化为相同的内容,第二个可能会使用更多内存,假设分配的内存在超出作用域后不会立即被垃圾回收

在处理步骤方面,再次假设编译器没有修复它,第二个将在每个循环中采取额外步骤为字符串分配内存

我通常在需要变量之前在组中声明它们,但我认为这在很大程度上是使用低级语言时遗留下来的偏执行为


在一个更大的函数中(我们知道应该避免),从技术上讲,您应该使用更多的内存预先声明所有变量,而不是根据需要(因为内存是即时使用的,而不是增量使用的)。为了更进一步,您需要使用更多的内存将所有临时变量声明为成员变量(这是在方法开始时声明它们的逻辑扩展),因为它们的分配寿命更长。

我知道这一点,我认为这是隐含的。我试图成为语言/编译器不可知论者。从理论上讲,这是有区别的,考虑一下这种区别是很好的。i++和++i在for循环中解析为相同的内容,但它们并不总是(增量后的开销更大)。即使你不需要再去考虑那些类型的事情,但这并不意味着你不应该这样做。
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);
}