我一直在想让代码更具可读性。我有很多的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"))
}
答案 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。