C Finalize和Dispose的區別

2021-09-07 21:29:49 字數 1155 閱讀 8412

一:總結

1、finalize方法(c#中是析構函式,以下稱析構函式)是用於釋放非託管資源的,而託管資源會由gc自動**。所以,我們也可以這樣來區分 託管和非託管資源。所有會由gc自動**的資源,就是託管的資源,而不能由gc自動**的資源,就是非託管資源。在我們的類中直接使用非託管資源的情況很 少,所以基本上不用我們寫析構函式。

2、大部分的非託管資源會給系統帶來很多負面影響,例如資料庫連線不被釋放就可能導致連線池中的可用資料庫連線用盡。檔案不關閉會導致其它程序無法讀寫這個檔案等等。

實現模型:

1、由於大多數的非託管資源都要求可以手動釋放,所以,我們應該專門為釋放非託管資源公開乙個方法。實現idispose介面的dispose方法是最好的模型,因為c#支援using語句快,可以在離開語句塊時自動呼叫dispose方法。

2、雖然可以手動釋放非託管資源,我們仍然要在析構函式中釋放非託管資源,這樣才是安全的應用程式。否則如果因為程式設計師的疏忽忘記了手動釋放非託管資源, 那麼就會帶來災難性的後果。所以說在析構函式中釋放非託管資源,是一種補救的措施,至少對於大多數類來說是如此。

3、由於析構函式的呼叫將導致gc對物件**的效率降低,所以如果已經完成了析構函式該幹的事情(例如釋放非託管資源),就應當使用suppressfinalize方法告訴gc不需要再執行某個物件的析構函式。

4、析構函式中只能釋放非託管資源而不能對任何託管的物件/資源進行操作。因為你無法**析構函式的執行時機,所以,當析構函式被執行的時候,也許你進行操作的託管資源已經被釋放了。這樣將導致嚴重的後果。

5、(這是乙個規則)如果乙個類擁有乙個實現了idispose介面型別的成員,並建立(注意是建立,而不是接收,必須是由類自己建立)它的例項物件,則 這個類也應該實現idispose介面,並在dispose方法中呼叫所有實現了idispose介面的成員的dispose方法。

只有這樣的才能保證所有實現了idispose介面的類的物件的dispose方法能夠被呼叫到,確保可以手動釋放任何需要釋放的資源。

三:維護內部非託管資源的託管類的手段:finalize()--終結和dispose()--處置

非託管資源:原始的作業系統檔案控制代碼,原始的非託管資料庫連線,非託管記憶體或其他非託管資源。

finalize()特性:

dispose()特性:

個人總結:

相同點:

不同點:

C Finalize和Dispose的區別

一 總結 1 finalize方法 c 中是析構函式,以下稱析構函式 是用於釋放非託管資源的,而託管資源會由gc自動 所以,我們也可以這樣來區分 託管和非託管資源。所有會由gc自動 的資源,就是託管的資源,而不能由gc自動 的資源,就是非託管資源。在我們的類中直接使用非託管資源的情況很 少,所以基本...

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...

rpx和樣式和class和flex

5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...