如果我将 null 分配给对象或 属性,C# 中的垃圾收集器是否总是 运行 并释放其内存 space?

If I assign null to an object or a property, will the garbage collector in C# always run and release its memory space?

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

垃圾收集器会释放属性吗space?

另外:

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

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

在您的第一个示例中,a.Name 只占用了 space 所需要的空间来保存对 a.Name 类型对象的引用。它是否包含 null 或引用并不重要。这个 space 只有在整个对象 a 被收集时才会被收集。当您将 a.Name 设置为 null 时,可能会收集 a.Name 指向的对象。

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

在任何情况下,您都不能仅通过分配 null 来触发垃圾收集,因为收集可以在运行时认为合适的任何时间发生。您可能想阅读 the documentation.

中的详细信息

第一种情况不清楚Name是什么。如果它是 string 那么是的,将它设置为 null 最终会释放内存。如果它是 class 那么它可能会也可能不会但是你的第二个问题已经涵盖了。

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