代码之家  ›  专栏  ›  技术社区  ›  123Developer

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

  •  2
  • 123Developer  · 技术社区  · 16 年前

    我知道.NET管理世界中的静态对象加载在永远不会被垃圾收集的加载器堆中。

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

    今晚我真的很困惑,请引导我。

    谢谢和问候

    123显影剂。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Philip Daubmeier    16 年前

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

        2
  •  2
  •   Lasse V. Karlsen    16 年前

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

    是否可以在方法调用期间收集它,或者只有在它完成之后才能收集它,取决于方法如何处理参数,以及对象是否在方法调用之外使用。

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

    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
        }
    }
    

    在这种情况下,o可以在调用 OtherMethod ,前提是您编译并运行一个发布版本。对于发布版本,不再使用的变量和参数,也就是说,没有使用它的代码,被认为是死的,因此在检查是否存在对对象的活动引用时不再计算。

    在debug build中,所有变量和参数都被人为地保持活动,直到方法返回,这样您就可以设置一个断点并检查变量,即使没有使用它的代码了。

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

        3
  •  1
  •   kemiller2002    16 年前

    一旦对变量执行了静态方法,它就不再保存对它的引用(如果将其赋给静态变量,则不同)。但这并不意味着它将被立即垃圾收集。除非您明确地告诉GC运行,否则,当它运行时认为需要释放内存时,它就会运行。事实上,这在应用程序的生命周期中可能永远不会发生(资源将随着应用程序的结束而释放)。然而,这是极不可能的,尽管技术上是可能的。

    推荐文章