我一直在考虑让我的代码更具可读性。因为我在代码中处理了大量的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"))
}
可能(当然在调试模式下)有一个未命名的局部变量,用于在不命名变量的版本中存储dr.Field<string>("Name")
的结果。
即使这样,该变量在此方法中也存在一次。每次循环都没有获得新变量。
在实例化对象时分配内存,而不是在引用它时分配内存。因此,无论您对同一个实例有多少引用,内存都不会增加。
这意味着考虑到它们的内存占用情况,以下两条线是相同的:
MyClass a = new MyClass();
Console.WriteLine(a);
和
Console.WrileLine(new MyClass());
在这两种情况下,只有一个类的实例,而不是两个。因此,对于类的一个实例来说,内存消耗正是如此(加上一些小的参考资料,在32位机器上,4字节,64位8字节)。
在你的情况下,在调用dr.Field<string>("NAME")
时会分配内存。然而,在您的第一个代码中引用了对象,因此可能在纳秒之后(当循环在下一次迭代时)进行垃圾收集。
说过这种情况,当你有一百万个引用都引用完全相同的对象时,你的内存增加很多(如果有的话)。
无论何时遇到这种情况,你都应该使用像nameColumn
这样的临时变量。
每次调用dr.Field<string>("NAME")
时,运行时都必须构造一个迭代器并对一组对象执行字符串匹配算法,以便找到要访问的正确字段。访问Field
方法导致的开销远远超过临时变量可能造成的影响。
因此,如果您计划在多个地方使用nameColumn
,那么变量就是您所需要的。即使你不重复使用它,把它放在开头并不是一个坏习惯。
添加变量不太可能产生任何负面影响。编译器甚至可能最终生成相同的IL。