2011-09-04 20 views
0

當我們有一個包含使用一個靜態對象的靜態方法的類時,請考慮這種情況。使用靜態成員時釋放資源

public class Person 
{ 
    private static PresonActions actions = new PresonActions(); 

    public static void Walk() 
    { 
     actions.Walk(); 
    } 
} 

我知道asp.net應用中靜態成員的生命週期等於appdomain生命週期。 所以這意味着對象不會被銷燬,資源也不會被釋放,直到我重新啓動appdomain。

但是,如果我們將使用一個屬性來創建PresonActions類的一個實例,每次訪問它時,對象是否會被銷燬?

public class Person 
{ 
    private static PresonActions actions { get { return new PresonActions(); } } 

    public static void Walk() 
    { 
     actions.Walk(); 
    } 
} 

謝謝。

+0

如果您沒有任何對該對象的引用,它應該通過GC進行處理。你是否必須爲每個獲得的動作值創建新的PersonActions對象?或者你只是想把它變成一個物業? – Cipi

+0

@Cipi沒有必要的新對象,但我想確保對象不會永遠存在內存中 – jekcom

回答

2

靜態變量連續分配是一個邪惡。留意你的內存消耗情況,特別是如果你在談論服務器端組件(ASP.NET)。

要回答你的問題:當他可以時,GC收集一個對象,應用程序中任何人都不再引用該對象。

不要這樣做。這種方法很容易跳入內存問題,並花費數小時來查找內存泄漏。

如果要更改對象內容,請編寫一個更新對象內容的函數,而不必創建它的新實例。

0

在你的第二個代碼示例中,在調用actions.Walk()之後,垃圾收集器將銷燬對象某時間。垃圾回收器以非確定性方式執行此操作,即無法確定它何時執行此操作。

如果您的類型正在使用您確定要處理的資源,那麼該類型應該執行IDisposable,並且它的執行方法應該執行這些資源的處置。

然後,使用代碼可以直接調用此方法,也可以使用using塊來處理對象,然後處理它的資源。

e.g.:-

public class PresonActions : IDisposable 
{ 
    ... 
    public void Dispose() 
    { 
     ... 
    } 
} 

public class Person 
{ 
    public static void Walk() 
    { 
     using(var actions = new PresonActions()) 
     { 
      actions.Walk(); 
     } 
    } 
} 

需要注意的是,因爲你沒有使用實例不止一個方法調用,沒有一點的靜態屬性創建它。它可以在方法中創建,它允許使用using塊。

+0

事實上,我有很多使用一個通用對象的方法。關鍵是避免在每種方法中創建實例,只是爲了清晰的代碼。 – jekcom