对于在C#/ VB.NET中具有静态方法的类,如何进行垃圾收集?

RJ.*_*RJ. 6 c# garbage-collection

将对象设置为null会使GC标记为GC吗?

编辑:一个类有多个静态方法.在程序中使用这些方法时,确保在某个点之后将对象标记为GC的最佳方法是什么?

Jon*_*eet 11

方法根本不是垃圾收集 - 所以你的问题意味着什么并不是很清楚.

同样,您永远不会将对象设置为null.您可以将变量的值设为null,但这对于变量先前引用的任何对象都不起作用.它只是意味着下次垃圾收集器查找活动对象时,该变量不会将任何对象提供给必须在GC结束时保持活动状态的对象集.

我建议您阅读Jeffrey Richter关于垃圾收集的文章,了解更多背景知识,然后在掌握基础知识时再询问任何进一步的具体问题.


Pau*_*ane 5

如果您询问静态方法中变量引用的对象会发生什么情况,那么当这些对象不再在范围内时,它们就可以进行垃圾回收。

如果您正在谈论由静态字段引用的对象,那么简单来说,这些对象将不会被收集,直到它们的引用设置为 null。

下面的例子可以更好地说明这一点:

class Example
{
    private static object field1 = new object();

    public static void SomeMethod()
    {
        object variable1 = new object();

        // ...
    }

    public static void Deref()
    {
        field1 = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

field1引用的对象将在类加载时创建,并且即使在创建和销毁类 Example 的对象时也将保持根。收集该对象垃圾的唯一方法是调用 Deref() 方法,该方法将通过将引用设置为 null 来取消引用它。(实际上,可以通过卸载应用程序域来卸载类,但这有点高级,而且您可能不会经常遇到。)

相反,静态方法 SomeMethod() 创建一个对象并通过变量variable1引用它。一旦超出范围(在方法结束时),该对象就有资格进行垃圾回收。实际上,如果该方法的其余部分不引用它,则可以更早地收集它。