在循环中声明时,创建新实例是否会占用内存?

时间:2017-11-01 09:15:44

标签: c# .net oop

List<object> obj = new List<object>();
List<objectTypeof_d> list = new List<objectTypeof_d>();

foreach (Object o in obj)
{
    d = new Object();
    d = o;
    list.add(d);
}

我试图理解在循环中我们声明d = new Object();然后每次循环它都会创建对象的新实例。它是更好的编码或者下面是正确的。

List<object> obj = new List<object>();
List<objectTypeof_d> list = new List<objectTypeof_d>();

foreach (Object o in obj)
{
    d = new Object();
    d = o;
    list.add(d);
    d = null;
} 

它只是用于理解忽略语法,或者假设对象在循环中添加到列表中。添加之后我们可以将其设置为null或不。仅用于内存优化。

2 个答案:

答案 0 :(得分:2)

new将始终创建一个新实例,无论是否循环。因此,在您的情况下,您正在创建Object的多个实例,并在您通过行d = o覆盖对该实例的唯一引用时抛弃它们。我想你可以简单地删除那一行并写下来:

foreach (Object o in obj)
{
    list.add(o);
}  

甚至更简单:

list.AddRange(obj);

但是,由于您从未向obj添加任何内容(列表BTW的名称错误),因此循环将不会执行。

答案 1 :(得分:2)

您似乎没有理解参考文献的概念 我建议你阅读Values vs Reference Types

在第一个示例中,您创建了一个调用d = new Object();的对象的新实例。此变量d引用一个存储区域来存储您的对象(我想这里仅使用Object)。

现在,以下行将存储在d(参考值)中的值更改为存储在o中的参考值。因此,第一个引用丢失并准备好进行垃圾回收。

说,很明显,你在这里的真正优化是删除变量d和对new object()的调用。 (以及对d = null;)的呼吁

无论如何,保持实际代码,设置变量d = null;不会改变你的内存占用。当垃圾收集器运行时,将执行内存的实际清理,并且当需要运行该进程时,系统会选择此时间。

通常认为“我需要更多的可用内存,强迫垃圾收集器运行”这是一个坏主意。