C 中Dispose 析構函式 close的區別

2022-05-17 13:33:07 字數 1894 閱讀 8729

一、close與dispose這兩種方法的區別

呼叫完了物件的close方法後,此物件有可能被重新進行使用;而dispose方法來說,此物件所占有的資源需要被標記為無用了,也就是此物件要被銷毀,不能再被使用。例如常見.net類庫中的sqlconnection這個類,當呼叫完close方法後,可以通過open重新開啟乙個資料庫連線,當徹底不用這個物件了就可以呼叫dispose方法來標記此物件無用,等待gc**。

二、三者的區別如圖

析構函式

dispose方法

close方法

意義銷毀物件

銷毀物件

關閉物件資源

呼叫方式

不能被顯示呼叫,在gc**是被呼叫

需要顯示呼叫或者通過using語句

需要顯示呼叫

呼叫時機

不確定確定,在顯示呼叫或者離開using程式塊

確定,在顯示呼叫時

三、析構函式 和 dispose 的說明

四、close函式的說明

close 這個方法在不同的類中有不同的含義,並沒有任何規定要求 close 具有特殊的含義,也就是說 close 並不一定要釋放資源,您也可以讓 close 方法表示「關門」。  不過,由於 close 有「關」的意思,通常也把 close 拿來釋放資源,這也是允許的。比如檔案操作中,用 close 釋放物件似乎比 dispose 含義更準確,於是在設計類時,可以將 close 設為 public,將 dispose 設為 protected,然後由 close 呼叫 dispose。 也就是說 close 表示什麼意思,它會不會釋放資源,完全由類設計者決定。網上說「close 呼叫 dispose」這種方法是很片面的。在 sqlconnection 中 close 只是表示關閉資料庫連線,並沒有釋放 sqlconnection 這個物件資源。   根據經驗,close 和 dispose 同時存在的情況下(均為 public),close 並不表示釋放資源,因為通常情況下,類設計者不應該使用兩個 public 方法來釋放相同的資源。

五、析構函式和dispose方法例項 

1

public

class

baseresource: idisposable

2... 9//

無法被客戶直接呼叫

10//

如果 disposing 是 true, 那麼這個方法是被客戶直接呼叫的,那麼託管的,和非託管的資源都可以釋放

11//

如果 disposing 是 false, 那麼函式是從垃圾**器在呼叫finalize時呼叫的,此時不應當引用其他託管物件所以,只能釋放非託管資源

12protected

virtual

void dispose(bool

disposing)

13...

20//

釋放非託管資源

21dounmanagedobjectdispose();

22//

那麼這個方法是被客戶直接呼叫的,告訴垃圾**器從finalization佇列中清除自己,從而阻止垃圾**器呼叫 析構函式 方法.

23if

(disposing)

24    gc.suppressfinalize(this

); 25

} 26

//可以被客戶直接呼叫

27public

void

dispose()

28...

32 }

view code

參考:託管資源:由clr管理分配和釋放的資源,即由clr裡new出來的物件;

非託管資源:不受clr管理的物件,windows核心物件,如檔案、資料庫連線、套接字、com物件等;

改善c#程式的建議4:c#中標準dispose模式的實現

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

Finalize和Dispose與析構的區別

在clr中記憶體管理的真正工作是由idisposable介面的dispose 方法和類的析構函式完成的。當有非託管資源需要釋放的時候,通常應該執行finalize 方法來代替析構函式。idisposable是乙個介面,它並不侷限在c 中,它是microsoft的com技術的一部分,它提供的乙個用於清...

C 析構函式和虛析構函式。

析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...