静态方法内存消耗

时间:2011-09-02 14:25:22

标签: c# memory static

我有以下类使用以下方法:

public class Foo
{
   public string A {get;set;}

   public static Foo New(string a)
   {
      Foo newFoo = new Foo();
      newFoo.A = a;
      return newFoo;
   }
 }

 public class Bar
 {
   public void SomeMethod()
   {
       ...
       Foo anotherFoo = Foo.New("a");
       ....
   }
 }

如果Bar类在使用上面的代码的过程中创建Foo,Foo是否会超出范围并获得垃圾收集,或者Foo(因为它使用的是静态方法)继续引用变量newFoo,因此另一个Foo永远不会超出范围?

3 个答案:

答案 0 :(得分:6)

静态方法的存在不会影响对象对GC的合格性,只会引用该对象。在您的情况下,anotherFoo将是唯一的参考。当方法返回时,引用newFoo超出范围,弹出堆栈。

静态方法中的局部变量本身并不是“静态的”,当方法返回时,这些局部变量将从执行堆栈中弹出,与非静态方法相同。

anotherFoo返回时,SomeMethod背后的基础对象将符合GC的条件(好吧,编译器更具攻击性,并且当anotherFoo不再用于{{1}}时可以使其具备GC能力代码)。

答案 1 :(得分:4)

只要a完成,

Foo.New()就会离开范围。返回对newFoo的引用,然后newFoo超出范围。 SomeMethod仍然通过anotherFoo引用引用该实例,因此在SomeMethod完成之前,引用不可用于垃圾收集,除非保存该引用。

答案 2 :(得分:1)

类从不“超出范围”。实例(参考)做。对于newFoo引用,当New New方法结束时,它会超出范围,而当SomeMethod方法结束时,它将超出另一个.Foo。

该方法是静态的这一事实并没有改变任何东西,事实上,你甚至在Foo中都有一个静态变量,它不会改变任何东西,因为静态变量是在一个名为“高频堆”的单独堆上创建的GC显然从不收集任何东西。