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

C#/VB.NET中具有静态方法的类如何进行垃圾收集?,c#,garbage-collection,C#,Garbage Collection,将对象设置为null是否会将其标记为GC 编辑:一个类有多个静态方法。在程序中使用这些方法时,确保对象在某个时间点后标记为GC的最佳方法是什么?方法根本不是垃圾收集的-因此不清楚您的问题的真正含义 同样,您从不将对象设置为null。您可以将变量的值设为null,但这对变量先前引用的任何对象都不起作用。这只是意味着,下次垃圾收集器查找活动对象时,该变量不会向必须在GC结束时保持活动状态的对象集贡献任何对象 我建议你多读一点背景知识,然后在掌握了基本知识后再问一些具体问题 对象未标记为对于GC,它们

将对象设置为null是否会将其标记为GC

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

方法根本不是垃圾收集的-因此不清楚您的问题的真正含义

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


我建议你多读一点背景知识,然后在掌握了基本知识后再问一些具体问题

对象未标记为对于GC,它们(通过存在引用或指向它们的变量)标记为未被垃圾收集。当所有正在运行的线程、所有全局静态变量和所有cpu寄存器中的每个变量或对对象的引用都已被删除、超出范围或设置为null时,对象将不再可访问,GC将收集它

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

如果您谈论的是静态字段引用的对象,那么简单地说,这些对象在引用设置为null之前不会被收集

以下示例可以更好地说明这一点:

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

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

        // ...
    }

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


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

将静态方法视为类方法。无论对象是否存在,它们都可用。它们对垃圾收集没有影响