提问者:小点点

如果我将null分配给一个对象或属性,那么C#中的垃圾回收器是否会一直运行并释放其内存空间?


A a = new A();
a.Name = null;

垃圾回收器会释放属性的空间吗?

此外:

B b = new B();
b = null;

垃圾收集器会释放对象的空间吗?


共2个答案

匿名用户

在您的第一个示例中,a.name只占用保存对a.name类型的对象的引用所需的空间。 它是否包含null或引用都无关紧要。 只有当收集整个对象a时,才会收集该空间。 当您将a.name设置为null时,可能会收集a.name所指向的对象。

在第二个示例中,b可能会被收集,也可能不会被收集。

在任何情况下,您都不能仅仅通过添加null来触发垃圾收集,因为收集可以在运行库认为合适的任何时候发生。 您可能需要阅读文档中的详细信息。

匿名用户

第一种情况不清楚名称是什么。 如果它是字符串,则是,将其设置为null将最终释放内存。 如果它是一个类,那么它可能是,也可能不是,但这在您的第二个问题中已经涵盖了。

所以在第二种情况下,如果这是应用程序的所有代码,内存最终将被释放。 但是,一个对象可以对某个事件有多个引用或订阅,这可能会阻止它被垃圾收集,因此仅仅将初始引用设置为null并不是在每种情况下都允许收集。