析构函数与IDisposable接口
一、析构函数
.net的析构函数代码会被编译在Finalize()中
protected override void Finalize()
{
try
{
//destructor implementation
}
finally
{
base.Finalize();
}
}
在.Net中,析够函数很少被使用,因为
1. 执行时间不确定,如果对象占用重要资源,则不能及时释放。与C++中不同,C#的析构函数不会在删除对象时立即执行,它依赖于垃圾收集器的工作方式。
2. 它会延迟对象最终从内存中删除的时间,没有析构函数的对象会在第一次垃圾收集时从内存中删除,而有析构函数的对象则需要两次处理才能删除。
二、IDisposable接口
在C#中,推荐使用IDisposable接口替代析构函数。IDisposable接口定义了一个模式,为释放未托管资源提供了确定的机制。
使用方式
1. 使用try...catch,确保调用Dispose();
2. 使用using语句,在using语句作用域之外,Dispose()会被自动调用
using(SomeClass myclass = new SomeClass()) { //doing your process }
三、书中推荐的使用方法
实现IDisposable接口,同时使用析构函数,把析构函数作用一种预防机制,以防没有调用Dispose()。
例子参见C#高级编程第四版。