C#的資源回收

C#GC機制,使得在C#中內存自動管理,在一定的程度上,這省去了程序員的很多麻煩,這可以看成是一個很大的進步。

C++中,有一條很重要的原則,即資源的獲取就是初始化(“resource acquisition is initialization”),也即是在構造函數中獲取資源,在析構函數中釋放資源。由於對象的構造函數和析構函數發生在特定的時刻,並且析構函數的調用是自動並且強加的,所以一般這可以保證不會產生資源得不到釋放的情況(只要你正確的釋放了資源)。C++的這條原則對於資源的管理很有幫助。

內存也是很重要的一種資源,C#中把內存的管理自動化。GC僅僅是把內存的管理自動化,但是其他的資源管理仍然需要程序員手動的代碼管理,問題是:除去內存的資源管理的代碼放在哪裏?

C#也提供了析構函數,但是幾乎還不如不提供這種機制。因爲:析構函數的執行時機是不確定的;析構函數不能顯式的調用;析構函數在.NET框架下是Finalize虛函數的override,但是又不能按照override的一般規則進行。C#的析構函數幾乎是無效的、混亂的。

也許是爲了彌補這個缺陷,C#提供了IDispose標準化接口,使得用戶可以顯式的調用;同時爲了資源管理的自動調用,C#提供了了using用法。

using (T obj1 = new T(), obj2 = new T())

{

//………

}

上面的代碼要求T類型實現了IDispose接口,然後C#會自動的調用接口的方法Dispose

       如果你使用的某種方法式成功的(C++的析構函數機制),那麼你會總是使用它。而現在,C#提供了新的用法;雖然它是不得已的;但是對於C++的老用戶來說,又得改變自己的習慣了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章