2011-12-28 27 views
2

請考慮下面的類:一次性類

public class Level : IDisposable 
{ 
    public Level() { } 

    public void Dispose() { } 
} 

我的問題是,如果我叫了Dispose方法,將類實際上被佈置(垃圾收集)?

例如:

Level level = new Level(); 
level.Dispose(); 

感謝。

+2

請解釋一下「被處置」是什麼意思。 – 2011-12-28 09:27:14

+0

我的意思是收集垃圾。 – yonan2236 2011-12-28 09:29:33

回答

9

我的問題是,如果我調用Dispose方法,該類實際上會被丟棄嗎?

如果配置你的意思是垃圾回收,則沒有,這不會發生。當您調用Dispose方法時會發生什麼情況,以及調用Dispose方法並執行其主體。

此外,建議將一次性資源打包到using statement以確保即使在發生異常時也始終調用Dispose方法。因此,而不是手動調用它,你可以:

using (Level level = new Level()) 
{ 
    // ... do something with the level 
} 

當對象持有指向一些非託管資源,並提供了一種機制,以確定性釋放這些資源通常使用Dispose方法。

+0

那麼我該如何執行它?假設類中還有其他屬性,方法等? – yonan2236 2011-12-28 09:27:28

+0

@ yonan2236,你在說什麼?你如何期待這樣一個問題的答案:'假設班上還有其他的屬性,方法等?'。這個班正在做什麼?它的目的是什麼?有什麼方法用於?這個類是否持有指向非託管資源的指針?首先,你認爲你需要實現Dispose模式? .... – 2011-12-28 09:30:23

+0

對不起,如果你沒有得到我的觀點,我無法解釋得很好。不是C#極客,我只是自學這門語言。我想我無法在目前的水平上進一步表達自己的想法。只是無視這個無意義的問題。 – yonan2236 2011-12-28 09:35:49

0

實現IDisposable的每個類都定義了要處置的含義。通過這種推理,是的,你的班級將按照自己的意願進行處理。

0

不,因爲調用Dispose,實例不會被垃圾回收。 Dispose方法是您可以釋放實例持有的任何資源的地方,而不是處理實例本身。

0

如果你打電話Dispose()它將被放置,這並不意味着絕對,這將是垃圾回收,在我看來,那是你的問題,如果不是請澄清。

3

我認爲你所追求的是一種知道Dispose()被調用的方法嗎?

你可以做到這一點無論是在由實例設置爲null消費代碼脫手後:

Level level = new Level(); 
//do stuff with the instance.. 
level.Dispose(); 
level = null; 

//in other place: 
if (level != null) 
{ 
    //still available 
} 

或者在類中,添加布爾標誌,並在它的每一個方法檢查:

public class Level : IDisposable 
{ 
    private bool disposing = false; 
    public Level() { } 

    public void Foo() 
    { 
     if (disposing) 
      return; 
     MessageBox.Show("foo"); 
    } 

    public void Dispose() 
    { 
     if (disposing) 
      return; 
     disposing = true; 
    } 
} 
+0

謝謝你。 – yonan2236 2011-12-28 09:38:17

+0

@yonan歡呼,這是你以後的樣子,還是你還需要更清楚的東西? – 2011-12-28 09:40:45

+0

沒別的,謝謝 – yonan2236 2011-12-28 09:42:35

0

在.NET處置和垃圾回收是兩件不同的事情:

處置的關鍵是釋放任何資源是eit她不是由.NET管理的(比如手動分配的內存),或者有興趣在不再需要它們時立即釋放(如文件句柄或網絡連接)。

垃圾回收的目的是釋放由.NET管理的內存(與普通對象一樣)。

所以,正如其他人指出的那樣:您的物品在處置時不一定會被垃圾收集。