垃圾回收器不知道如果释放非托管资源
非托管资源有:文件句柄、网络连接、数据库连接(有的在补充)
有两种机制可以自动释放非托管资源。
1:声明一个析构函数(或叫做终结器-finalizer),作为一个类的成员
2:在类中实现System.IDisposable接口。
垃圾回收器销毁对象之前,可以调用析构函数。
c#析构函数的实现会延迟对象最终从内存中删除的时间。没有析构函数的对象会在垃圾回收器的一次处理中从内存中删除,但有析构函数的对象需要两次处理才能销毁,第一次调用析构函数时,没有删除对象,第二次调用才真正删除对象。 运行库使用一个线程来执行所有对象的Finalizer()方法,频繁使用析构函数,对性能影响非常大。慎用析构函数。
IDisposable接口
推荐用IDisposable接口替代析构函数。
这个接口声明了一个Dispose()方法,这个方法的实现代码想显示地释放由对象直接使用的所有非托管资源。并在所有也实现IDisposeable接口的封转对象上调用Dispost()方法。