为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
LEATH 2021-12-25 16:38:07
我一直在考虑让我的代码更具可读性。我有很多 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"))}
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

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

即便如此,该变量在此方法中只存在一次。您不会每次通过循环都获得一个新变量。


查看完整回答
反对 回复 2021-12-25
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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

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

因此,如果您打算nameColumn在多个地方使用,那么变量就是您所需要的。即使你不重复使用它,一开始就把它放进去也不是一个坏习惯。

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


查看完整回答
反对 回复 2021-12-25
?
临摹微笑

TA贡献1982条经验 获得超2个赞

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

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

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

Console.WrileLine(new MyClass());

在这两种情况下,您的类都只有一个实例,而不是两个。因此,内存消耗选项正是类的一个实例(加上一些参考本身的少量数量,在 4 字节的 32 位机器上,在 64 位 8 字节上)。

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

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


查看完整回答
反对 回复 2021-12-25
  • 3 回答
  • 0 关注
  • 324 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信