請考慮下面的類:一次性類
public class Level : IDisposable
{
public Level() { }
public void Dispose() { }
}
我的問題是,如果我叫了Dispose
方法,將類實際上被佈置(垃圾收集)?
例如:
Level level = new Level();
level.Dispose();
感謝。
請考慮下面的類:一次性類
public class Level : IDisposable
{
public Level() { }
public void Dispose() { }
}
我的問題是,如果我叫了Dispose
方法,將類實際上被佈置(垃圾收集)?
例如:
Level level = new Level();
level.Dispose();
感謝。
我的問題是,如果我調用Dispose方法,該類實際上會被丟棄嗎?
如果配置你的意思是垃圾回收,則沒有,這不會發生。當您調用Dispose方法時會發生什麼情況,以及調用Dispose方法並執行其主體。
此外,建議將一次性資源打包到using statement以確保即使在發生異常時也始終調用Dispose方法。因此,而不是手動調用它,你可以:
using (Level level = new Level())
{
// ... do something with the level
}
當對象持有指向一些非託管資源,並提供了一種機制,以確定性釋放這些資源通常使用Dispose方法。
那麼我該如何執行它?假設類中還有其他屬性,方法等? – yonan2236 2011-12-28 09:27:28
@ yonan2236,你在說什麼?你如何期待這樣一個問題的答案:'假設班上還有其他的屬性,方法等?'。這個班正在做什麼?它的目的是什麼?有什麼方法用於?這個類是否持有指向非託管資源的指針?首先,你認爲你需要實現Dispose模式? .... – 2011-12-28 09:30:23
對不起,如果你沒有得到我的觀點,我無法解釋得很好。不是C#極客,我只是自學這門語言。我想我無法在目前的水平上進一步表達自己的想法。只是無視這個無意義的問題。 – yonan2236 2011-12-28 09:35:49
實現IDisposable
的每個類都定義了要處置的含義。通過這種推理,是的,你的班級將按照自己的意願進行處理。
不,因爲調用Dispose,實例不會被垃圾回收。 Dispose方法是您可以釋放實例持有的任何資源的地方,而不是處理實例本身。
如果你打電話Dispose()
它將被放置,這並不意味着絕對,這將是垃圾回收,在我看來,那是你的問題,如果不是請澄清。
我認爲你所追求的是一種知道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;
}
}
在.NET處置和垃圾回收是兩件不同的事情:
處置的關鍵是釋放任何資源是eit她不是由.NET管理的(比如手動分配的內存),或者有興趣在不再需要它們時立即釋放(如文件句柄或網絡連接)。
垃圾回收的目的是釋放由.NET管理的內存(與普通對象一樣)。
所以,正如其他人指出的那樣:您的物品在處置時不一定會被垃圾收集。
請解釋一下「被處置」是什麼意思。 – 2011-12-28 09:27:14
我的意思是收集垃圾。 – yonan2236 2011-12-28 09:29:33