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

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

}


LEATH
浏览 326回答 3
3回答

慕少森

很可能(当然在调试模式下)有一个未命名的局部变量用于存储未命名变量dr.Field<string>("Name")的版本中的结果。即便如此,该变量在此方法中只存在一次。您不会每次通过循环都获得一个新变量。

慕妹3146593

nameColumn在这种情况下,您绝对应该使用临时变量。每次调用 时dr.Field<string>("NAME"),运行时都必须构造一个迭代器并对一组对象执行字符串匹配算法,以便找到要访问的正确字段。访问Field方法造成的开销远远超过临时变量可能造成的任何影响。因此,如果您打算nameColumn在多个地方使用,那么变量就是您所需要的。即使你不重复使用它,一开始就把它放进去也不是一个坏习惯。添加变量不太可能产生任何负面影响。无论如何,编译器甚至可能最终生成相同的 IL。

临摹微笑

内存是在实例化对象时分配的,而不是在引用它时分配。因此,无论您有多少对同一实例的引用,内存都不会增加。这意味着考虑到它们的内存占用,以下两行是相同的:MyClass&nbsp;a&nbsp;=&nbsp;new&nbsp;MyClass(); Console.WriteLine(a);和Console.WrileLine(new&nbsp;MyClass());在这两种情况下,您的类都只有一个实例,而不是两个。因此,内存消耗选项正是类的一个实例(加上一些参考本身的少量数量,在 4 字节的 32 位机器上,在 64 位 8 字节上)。在您的情况下,调用dr.Field<string>("NAME").&nbsp;然而,在您的第一个代码中,对象被引用,因此它可能会在几纳秒后被垃圾收集(当循环进行下一次迭代时)。话虽如此,当您有一百万个引用都引用完全相同的对象时,您的内存不太可能增加很多(如果有的话)。
打开App,查看更多内容
随时随地看视频慕课网APP