我在.NET中編程了四年(主要是C#),並且我廣泛使用了IDiposable,但是我還沒有找到需要一個終結器。什麼是終結者?什麼是結局?
Q
什麼是結局?
7
A
回答
10
終結器是確保正確清理內容的最後一次嘗試,並且通常保留用於包裝非託管資源的對象,例如非託管句柄等不會收集垃圾的對象。
編寫終結器確實很少見。幸運的是(不像IDisposable
),終結器不需要傳播;所以如果你有一個帶終結符的ClassA
和包含ClassA
的ClassB
,那麼ClassB
不需要終結符 - 但很有可能ClassA
和ClassB
將實現IDisposable
。
對於託管代碼,IDisposable
通常就足夠了。即使你沒有正確清理,最終管理對象也會被收集(假設它們被釋放)。
1
終結器是用於清理資源,如果他們沒有處置。
IE中,沒有任何東西強制您調用Dispose(),但終結器由垃圾回收器自動調用。
不應該依賴此功能,因爲無法保證何時(或如果)垃圾回收會到達您的對象。
2
終結器是指釋放不受垃圾回收器控制的資源的機制,如非託管句柄。雖然Dispose
可能會這樣做,但並不保證消費者會給它打電話。
4
終結器僅用於釋放非託管資源,例如GDI位圖句柄。如果你不分配任何非託管資源,那麼你不需要終結器。一般來說,在終結器中觸摸任何對象都是不好的,因爲不能保證結束的順序。
使用終結器的另一個有用技巧是聲明當需要應用程序時調用Dispose。這可以幫助捕捉在調試版本編碼錯誤:
void Dispose()
{
GC.SuppressFinalize(this);
}
#if DEBUG
~MyClass()
{
Debug.Fail("Dispose was not called.");
}
#endif
1
維基百科says:
...終結是一段代碼, 確保當獲取的某些必要的行動 採取資源...... 不再被使用的,因爲 所屬對象已被垃圾收集 ]
如果在編寫IDisposables時不使用終結器,則很可能會發生內存泄漏,因爲不能保證所有者實際上會調用Dispose()。
MS自己建議你寫類似這樣到你的實施者東西:
public void Dispose()
{
this.Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (!this.isDisposed)
{
if (disposing)
{
GC.SuppressFinalize(this);
}
}
//Dispose of resources here
this.isDisposed = true;
}
~DisposableSafe()
{
this.Dispose(false);
}
private bool isDisposed = false;
就個人而言,我不能忍受的複製粘貼,所以我傾向於包裹,在重用的抽象類。
相關問題
- 1. 爲什麼是不同的結局
- 2. 什麼是flash.ctp佈局?
- 3. 什麼是自動佈局?
- 4. 這些佈局是什麼
- 5. 'print'%d「%(5)」的結局叫做什麼?
- 6. 這個結構的正確佈局是什麼?
- 7. 什麼是OSGi DB訪問的高級體系結構佈局?
- 8. Android設置活動的典型佈局結構是什麼?
- 9. 什麼是對象/結構等的C++內存佈局?
- 10. 什麼是結合本地和全局狀態
- 11. 爲什麼這個結構不是標準佈局?
- 12. JavaScript:什麼是全局對象,「this」指的是什麼?
- 13. 這是什麼C#結構
- 14. IQueryable的結構是什麼?
- 15. 什麼是結合數據
- 16. 這是什麼linux結構
- 17. 什麼是XSLT結果樹
- 18. 什麼是Eclipse的結構?
- 19. Resolv.conf的結構是什麼?
- 20. 「結束」是什麼意思?
- 21. AppxSignature.p7x的結構是什麼?
- 22. 是什麼結構和類
- 23. jQuery:這是什麼結構?
- 24. 這是什麼C++結構?
- 25. 什麼是contacts.edb結構?
- 26. 什麼是ASP.NET MVC結合
- 27. 爲什麼結果是NaN?
- 28. 這是什麼javascript結構?
- 29. 什麼是動作結果?
- 30. 什麼是distanceBetween結果的結果聯
順便說一句,我是英國人,我發現這是一個*真的* *真的*好主意,養成用z而不是s來拼寫「finalize」和「initialize」的習慣。否則,當您在文檔中搜索它們時,您永遠無法找到血腥的東西! – 2009-04-20 14:38:30
@onebyone - 同上。同樣,色彩......它曾經引起我的憤怒,但現在我只是將它們視爲行業的技術術語,並完成工作; -p – 2009-04-20 14:49:43
我一直在試圖訓練自己 - 我將它用於文檔和公共面臨的代碼,但我不能讓自己在「現實生活」中做到這一點。 – 2009-04-20 15:01:21