2011-09-02 69 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顯然從未收集任何東西。