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++的老用户来说,又得改变自己的习惯了。

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