C#中對象的銷燬有三種方式Finalize,Dispose,GC。

一、Finalize方法(C#中是析構函數,如下稱析構函數)是用於釋放非託管資源的,而託管資源會由GC自動回收。因此,咱們也能夠這樣來區分託管和非託管資源。全部會由GC自動回收的資源,就是託管的資源,而不能由GC自動回收的資源,就是非託管資源。在咱們的類中直接使用非託管資源的狀況不多,因此基本上不用咱們寫析構函數。

二、大部分的非託管資源會給系統帶來不少負面影響,例如數據庫鏈接不被釋放就可能致使鏈接池中的可用數據庫鏈接用盡。文件不關閉會致使其它進程沒法讀寫這個文件等等。

實現模型:
一、因爲大多數的非託管資源都要求能夠手動釋放,因此,咱們應該專門爲釋放非託管資源公開一個方法。實現IDispose接口的Dispose方法是最好的模型,由於C#支持using語句快,能夠在離開語句塊時自動調用Dispose方法。

二、雖然能夠手動釋放非託管資源,咱們仍然要在析構函數中釋放非託管資源,這樣纔是安全的應用程序。不然若是由於程序員的疏忽忘記了手動釋放非託管資源,那麼就會帶來災難性的後果。因此說在析構函數中釋放非託管資源,是一種補救的措施,至少對於大多數類來講是如此。

三、因爲析構函數的調用將致使GC對對象回收的效率下降,因此若是已經完成了析構函數該乾的事情(例如釋放非託管資源),就應當使用SuppressFinalize方法告訴GC不須要再執行某個對象的析構函數。

四、析構函數中只能釋放非託管資源而不能對任何託管的對象/資源進行操做。由於你沒法預測析構函數的運行時機,因此,當析構函數被執行的時候,也許你進行操做的託管資源已經被釋放了。這樣將致使嚴重的後果。

五、(這是一個規則)若是一個類擁有一個實現了IDispose接口類型的成員,並建立(注意是建立,而不是接收,必須是由類本身建立)它的實例對象,則這個類也應該實現IDispose接口,並在Dispose方法中調用全部實現了IDispose接口的成員的Dispose方法。
只有這樣的才能保證全部實現了IDispose接口的類的對象的Dispose方法可以被調用到,確保能夠手動釋聽任何須要釋放的資源。程序員

相關文章
相關標籤/搜索