看到蟈蟈談到 msdn 中關於連結關閉的一些警告???
談到Finalize方法,對unmanaged資源的態度。Finalize方法中應該只釋放自己直接控制的unmanagedr資源,而不應該去調用對象引用的Connection之類的Close或者Dispose方法來釋放這些對象的unmanaged資源.這些資源的釋放應該由各自的直接領導(即剛才提到的Connection之類)負責。
C#偽碼解釋。
class Foo
{
SqlConnection conn;
ManagedResource src;
~Foo()
{
conn.Close();//錯誤,不應該在這裡調用conn的Close方法來
//釋放conn的unmanagedr資源.
src = null;//這也大可不必了。
}
}
class SqlConnection
{
//Connection的unmanaged資源,應該通過他自己的Finalize方法來釋放.
~SqlConnection()
{
Dispose(false);
}
}
因為,走到Finalize這一步,object已經是直差咽氣了,他通過欄位引用的其他對象也排到了Finalize的釋放隊列上。GC對Finalize方法的調用是無序的,很可能在你調用 你的類引用的Connection的對象的Close方法之前,他自己的Finalize方法已經執行了,即他應經先咽氣了。這個Close的調用就變得很玄乎了。
上面的代碼中,Foo不應該對他持有的SqlConnection即這裡的conn調用Close方法。conn的非託管資源應該由他自己的Finalize釋放。就是說沒有義務在~Foo()中作conn.Close()操作。
同樣在Finalize方法中對,managed資源設定Null 參考也是多餘的事情。但在Dispose或者Close方法中這又是個積極的做法。
當然,Finalize方法的實際執行,我們是希望不要發生的.只將它作為釋放unmanaged資源的最後一條防線,對於實現了IDisposable介面的class我們應該積極的通過using()文法來使用,或者其它能確保Dispose()的調用的方法。