C# 在循环中声明时,创建新实例是否会消耗内存?

C# 在循环中声明时,创建新实例是否会消耗内存?,c#,.net,oop,C#,.net,Oop,这只是为了理解忽略语法,或者假设对象添加到循环中的列表中。添加后,我们可以将其设置为null或not。仅用于内存优化。new将始终创建一个新实例,无论它是否在循环中。因此,在您的例子中,您创建了对象的多个实例,并在用d=o行覆盖对该实例的唯一引用时将其丢弃。我想你可以简单地删除这一行,然后写下以下内容: List<object> obj = new List<object>(); List<objectTypeof_d> list = new List<

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

new
将始终创建一个新实例,无论它是否在循环中。因此,在您的例子中,您创建了
对象的多个实例
,并在用
d=o
行覆盖对该实例的唯一引用时将其丢弃。我想你可以简单地删除这一行,然后写下以下内容:

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;
} 
或者更简单:

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

但是,由于您从不向obj添加任何内容(顺便说一句,列表的名称不好),因此循环根本不会执行。

new
将始终创建一个新实例,无论它是否在循环中。因此,在您的例子中,您创建了
对象的多个实例
,并在用
d=o
行覆盖对该实例的唯一引用时将其丢弃。我想你可以简单地删除这一行,然后写下以下内容:

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;
} 
或者更简单:

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

但是,由于您从未向obj添加任何内容(顺便说一句,列表的名称不好),循环根本不会执行。

您似乎还没有掌握引用的概念。
我建议读一下这个

在第一个示例中,您创建了一个对象的新实例,调用
d=newobject()
这个变量d引用一个内存区域来存储对象(我假设您在这里仅使用object作为示例)

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

话虽如此,但很明显,这里真正的优化是删除变量d和对
newobject()
的调用。(以及对
d=null;
的调用)

无论如何,还要维护实际代码,设置变量
d=null不会更改内存占用。内存的真正清理是在垃圾收集器运行时执行的,这一次由系统在需要运行该进程时选择


认为“我需要更多的空闲内存,让我们强制运行垃圾收集器”通常是个坏主意。

看来您还没有掌握引用的概念。
我建议读一下这个

在第一个示例中,您创建了一个对象的新实例,调用
d=newobject()
这个变量d引用一个内存区域来存储对象(我假设您在这里仅使用object作为示例)

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

话虽如此,但很明显,这里真正的优化是删除变量d和对
newobject()
的调用。(以及对
d=null;
的调用)

无论如何,还要维护实际代码,设置变量
d=null不会更改内存占用。内存的真正清理是在垃圾收集器运行时执行的,这一次由系统在需要运行该进程时选择



认为“我需要更多的空闲内存,让我们强制运行垃圾收集器”通常是一个坏主意。

在新建之后,您更改通过将变量d分配给o的引用而获得的引用。因此,你的新的是无用的,你可以删除它。因此,您的问题是……?您正在迭代一个空列表(
obj
)。你必须把东西放进去。只是为了理解上面的循环正确性,或者设置obj=null以便在使用后处理对象。就是这样。@DhruvParmar不,设置
something=null
不是正确的处理方法。垃圾收集器会处理它。但是,有些东西,例如SqlConnection和其他许多东西,使用垃圾收集器不能影响的非托管资源-这些东西需要调用它们的
.Dispose()
方法。新建之后,您更改通过将变量d分配给o的引用而获得的引用。因此,你的新的是无用的,你可以删除它。因此,您的问题是……?您正在迭代一个空列表(
obj
)。你必须把东西放进去。只是为了理解上面的循环正确性,或者设置obj=null以便在使用后处理对象。就是这样。@DhruvParmar不,设置
something=null
不是正确的处理方法。垃圾收集器会处理它。但是,有些东西,如SqlConnection和其他许多东西,使用垃圾收集器不能影响的非托管资源-这些东西需要调用它们的
.Dispose()
方法;优化循环中的内存。不,除非您有一个长时间运行的代码块,否则这通常都是一个无操作。垃圾收集器通常会体面地丢弃这些实例。垃圾收集器什么时候抛出实例?什么时候决定。这是指不再引用实例的情况。在您的情况下,这取决于您在何处声明
d
@DhruvParmar如果您需要关心何时,您的对象应该实现
IDisposable
。我希望得到这样的答案:我们可以将object=null;优化循环中的内存。不,除非您有一个长时间运行的代码块,否则这通常都是一个无操作。垃圾收集器通常会体面地丢弃这些实例。垃圾收集器什么时候抛出实例?什么时候决定。这是指不再引用实例的情况。在您的情况下,这取决于您在何处声明
d
@DhruvParmar如果您需要关心何时,您的对象应该实现
IDisposable
“思考往往是个坏主意……”我会更进一步,并说“假设这一切都是个坏主意”。我同意您的看法。我从来没有叫过GC。收集bu