Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实例化大量变量(字符串、int等)会消耗大量内存吗?_C# - Fatal编程技术网

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

C# 实例化大量变量(字符串、int等)会消耗大量内存吗?,c#,C#,我一直在考虑让我的代码更具可读性。我有很多foreach和for循环,因为我在代码中处理了很多数据表 如果我实例化将在循环中使用的列名,可以吗?还是会消耗太多内存?例如: DataTable fooTable = new DataTable(); foreach(DataRow dr in fooTable.Rows) { string nameColumn = dr.Field<string>("NAME") Console.WriteLine(nameColumn)

我一直在考虑让我的代码更具可读性。我有很多foreach和for循环,因为我在代码中处理了很多数据表

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

DataTable fooTable = new DataTable();

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


在调试模式下,很可能存在一个未命名的局部变量,用于在不命名变量的版本中存储dr.FieldName的结果


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

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

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

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

在这两种情况下,您的类只有一个实例,而不是两个。因此,内存消耗选项正好是,对于类的一个实例,加上它们自身的一些少量引用,在一台32位的机器上(4字节),在64位的8字节上

在您的情况下,调用dr.FieldNAME时会分配内存。然而,在您的第一个代码中,对象被引用,因此当循环在下一次迭代中时,它可能会在几纳秒后被垃圾收集


话虽如此,如果有一百万个引用都引用了完全相同的对象,那么你的内存不太可能增加很多。

在这种情况下,你肯定应该使用一个临时变量,比如nameColumn

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

因此,如果您计划在多个位置使用nameColumn,那么变量就是您所需要的。即使你不重复使用它,在一开始就使用它也不是一个坏习惯


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

内存是在实例化对象时分配的,而不是在引用对象时分配的。因此,无论对同一个实例有多少个引用,除了4字节的低内存消耗外,内存不会增加???对于引用本身。因此,为了获得更清晰、更可读的代码,如果我实例化了很多对象,是否明智?不要猜测内存性能。设定现实的目标,编写简单易读的代码,然后进行度量。如果它符合你的目标,很好,继续前进。诚然,知道什么是现实的目标需要一些经验,但不要试图通过死记硬背的规则来学习任何与绩效相关的东西。我想我以后会担心记忆力和绩效。现在,我将坚持你的建议,使代码更具可读性,即使我最终使用了很多变量。优化的第一条规则:你通常错误地认为性能问题可能在哪里。举例说明:与强类型对象的容器相比,DataTable在内存使用方面是一个非常低效的类。若内存使用真的是一个问题,那个么这可能比你们的任何变量都值得一看。规则0在这里也适用:你通常错误地认为首先需要优化,如果你还没有衡量任何东西,你总是错误的。
MyClass a = new MyClass();
Console.WriteLine(a);
Console.WrileLine(new MyClass());