2011-09-02 68 views
3

我有以下类以下方法:静态方法内存消耗

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"); 
     .... 
    } 
} 

如果酒吧上课期间使用上面的代码进程创建富,将富曾经走出去的范围,让垃圾收集或将Foo(因为它使用静态方法)继续引用变量newFoo,因此anotherFoo永远不会超出范围?

回答

5

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

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

SomeMethod回报(当然,编译器是更积极,并能使其GC-能够当anotherFoo不再代码中使用)背后anotherFoo根本目的将符合GC。

4

a一旦Foo.New()完成,即可离开作用域。返回newFoo的引用,然后newFoo超出范围。 SomeMethod仍然通过anotherFoo引用引用该实例,因此除非保存该引用,否则引用不可用于垃圾回收直到SomeMethod完成。

1

班级从不“超出范围”。实例(引用)。至于newFoo引用,当SomeMethod方法结束时,New方法以及anotherFoo结束时,它会超出范围。

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