如果我将 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
的初始引用并不能在每种情况下授予收集。
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
的初始引用并不能在每种情况下授予收集。