传递给静态方法的实例引用参数是否会被垃圾收集?

时间:2010-04-21 12:58:41

标签: c# .net static

我知道.Net托管世界中的静态对象是在Loader Heap中加载的,它永远不会被垃圾收集。

传递给静态方法的实例引用参数会发生什么。一旦静态函数完全执行,它们是否会被垃圾收集?或者它们将永远存在,因为这些实例引用变量一旦传递给静态方法?

今晚真的很困惑;请指导我。

谢谢和问候

123Developer。

3 个答案:

答案 0 :(得分:3)

是的,执行静态函数后会对它们进行垃圾回收。您正在非静态上下文中创建对象,因此它们不是在加载程序堆中创建的。只是将引用传递给静态函数根本不会改变任何东西。

答案 1 :(得分:2)

您传递对静态方法的引用并不意味着该对象将以任何方式生根,因此仅靠这一点并不足以阻止它被收集。

是否可以在方法调用期间收集它,或者只在它完成之后收集它,取决于方法对参数的作用,以及对象是否在方法调用之外使用。

例如,请考虑这个假设代码:

public static class Program()
{
    public static void Main()
    {
        SomeObject o = new SomeObject();
        OtherMethod(o);
    }

    private static void OtherMethod(SomeObject x)
    {
        // lots of code here, but none that uses x
    }
}

在这种情况下,只要编译并运行发布版本,就可以在调用OtherMethod期间收集o。对于发布版本,不再使用的变量和参数,即没有使用它的代码,被认为是死的,因此在检查是否存在对象的实时引用时不再计算。

在Debug构建中,所有变量和参数都是人工保持活动的,直到方法返回,这样你就可以设置一个断点并检查变量,即使没有剩下使用它的代码。

因此,如果您要从调试版本运行上述代码,那么该对象将保持活动状态,直到Main返回。

答案 2 :(得分:1)

一旦使用变量完成静态方法,它就不再保存对它的引用(如果将它分配给静态变量,那就不同了)。这并不意味着它会立即被垃圾收集。除非你专门告诉GC运行,否则它是基于运行时感觉它需要释放内存的时间。说实话,在应用程序的生命周期中可能永远不会出现这种情况(资源将随应用程序结束而释放)。然而,尽管技术上可行,但这种可能性极小。