实例化很多变量(字符串,整数等)会消耗大量内存吗?

时间:2018-08-31 10:15:52

标签: c#

我一直在想让代码更具可读性。我有很多的foreach和for循环,因为我在代码中处理了很多数据表。

如果实例化将在内部循环中使用的列名,可以吗?还是会消耗太多内存?例如:

DataTable fooTable = new DataTable();

foreach(DataRow dr in fooTable.Rows)
{
   string nameColumn = dr.Field<string>("NAME")
   Console.WriteLine(nameColumn)
}

vs。

DataTable fooTable = new DataTable();

foreach(DataRow dr in fooTable.Rows)
{
   Console.WriteLine(dr.Field<string>("NAME"))
}

3 个答案:

答案 0 :(得分:1)

在您未命名变量的版本中,很可能(肯定是在调试模式下)有一个未命名的局部变量用于存储dr.Field<string>("Name")的结果。

即使在这种情况下,该变量也只存在一次。您不会在循环中每次都获得新变量

答案 1 :(得分:0)

实例化对象时分配内存,而不是在引用对象时分配内存。因此,无论您对同一实例有多少引用,内存都不会增加。

这意味着以下两行在内存占用方面是相同的:

MyClass a = new MyClass();
Console.WriteLine(a);

Console.WrileLine(new MyClass());

在两种情况下,您的类中只有一个单个实例,而不是两个。因此,内存消耗选项恰好是该类的一个实例(在用于4字节的32位计算机上,用于64位8字节的实例自身,再加上少量引用)。

在您的情况下,调用dr.Field<string>("NAME")时会分配内存。但是,在您的第一个代码中,该对象是被引用的,因此可能在数纳秒后(当循环在下一次迭代中时)被垃圾回收。

话虽如此,当您有100万个引用都引用完全相同的对象时,内存增加的可能性很小(如果有的话)。

答案 2 :(得分:0)

在这种情况下,绝对应该使用nameColumn之类的临时变量。

每次调用dr.Field<string>("NAME")时,运行时都必须构造一个迭代器并在一组对象上执行字符串匹配算法,以仅找到要访问的正确字段。通过访问Field方法引起的开销远远超过了临时变量可能造成的影响。

因此,如果您打算在多个地方使用nameColumn,则需要使用变量。即使您不重复使用它,将其放在开头也不是坏习惯。

添加变量不太可能产生负面影响。无论如何,编译器甚至可能最终生成相同的IL。