2009-04-15 54 views
0

我正在向C#程序中的using塊添加一些代碼。我有點stuff my我的應用程序,它以前是獨立於現有代碼體系的,因此我需要做一些混亂的處理以使其正確適用。那是什麼結局看起來像如下:C#在靜態對象中使用塊使用

public class WrapperForMyOldApp 
{ 

    public static ItemThatINeed item1; 
    public static ItemThatINeed item2; 

    public WrapperForMyOldApp() 
    { 
     item1 = new ItemThatINeed(); 
     item2 = new ItemThatINeed(); 
    } 

    public static go() 
    { 
     // some stuff that i need to do with items 1 and 2 
    } 
} 

public class MainProgram 
{ 
    . 
    . 
    . 

    public void MethodThatNeedsToMakeUseOfMyApp() 
    { 
     .... 
     using (WrapperForMyOldApp oldAPp = new WrapperForMyOldApp()) 
     { 
      WrapperForMyOldApp.go(); 
     } 
    } 
} 

好了,所以這裏的問題是:有我現在殘廢的使用塊和/或產生的任何特殊副作用,可能的類M​​ainProgram(主程序)產生不利影響的影響?我相信Wrapper對象和它的內容將被處置,並且執行將按預期繼續進行,但是有什麼我需要注意的是我忽略了嗎?

謝謝!

回答

5

爲了這個工作,你需要讓WrapperForMyOldApp實現IDisposable。

然後WrapperForMyOldApp中的Dispose()調用將進行清理。

但是,靜態對象通常用於具有超出單個對象的生命週期的對象。一般來說,對於這種用法,您可以使ItemThatINeed實例爲非靜態的,在WrapperForMyOldApp構造函數中生成它們,然後在WrapperForMyOldApp.Dispose()中進行清理。使用靜態對象,你可能會創建一個噩夢 - 你正在構造對象,然後說你想要執行清理(在使用塊的末尾),所以你的Dispose()方法將會是清理靜態物體。但是,如果他們再次使用,會發生什麼?如果在2個線程中創建兩個WrapperForMyOldApp實例,那麼正確的行爲是什麼?如果您需要確定性清理,我會考慮這些問題。

+0

非常有幫助 - 謝謝。 – 2009-04-15 19:05:13

6

你的包裝類是否實現IDisposable,你只是沒有顯示它?如果它不是一次性的,那麼你根本不需要使用聲明。

1

那麼,如果WrapperForMyOldApp執行IDisposable,並且您的Dispose()執行可以肯定擺脫任何資源,那麼它應該工作...但也可能有其他副作用。代碼可以改變全局(靜態)狀態,比如文化等。它可以產生線程。各種各樣的東西。

這不是一個壞的方法,但你需要知道你封裝的代碼是確實知道Dispose()是否會做任何有用的事情。