实例化很多变量(string,int等)会占用大量内存吗?

问题描述 投票:0回答:3

我一直在考虑让我的代码更具可读性。因为我在代码中处理了大量的DataTable,所以我有很多foreach和for循环。

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

DataTable fooTable = new DataTable();

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

DataTable fooTable = new DataTable();

foreach(DataRow dr in fooTable.Rows)
{
   Console.WriteLine(dr.Field<string>("NAME"))
}
c#
3个回答
1
投票

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

即使这样,该变量在此方法中也存在一次。每次循环都没有获得新变量。


0
投票

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

这意味着考虑到它们的内存占用情况,以下两条线是相同的:

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

Console.WrileLine(new MyClass());

在这两种情况下,只有一个类的实例,而不是两个。因此,对于类的一个实例来说,内存消耗正是如此(加上一些小的参考资料,在32位机器上,4字节,64位8字节)。

在你的情况下,在调用dr.Field<string>("NAME")时会分配内存。然而,在您的第一个代码中引用了对象,因此可能在纳秒之后(当循环在下一次迭代时)进行垃圾收集。

说过这种情况,当你有一百万个引用都引用完全相同的对象时,你的内存增加很多(如果有的话)。


0
投票

无论何时遇到这种情况,你都应该使用像nameColumn这样的临时变量。

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

因此,如果您计划在多个地方使用nameColumn,那么变量就是您所需要的。即使你不重复使用它,把它放在开头并不是一个坏习惯。

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

© www.soinside.com 2019 - 2024. All rights reserved.