C#中对象的销毁有三种方式Finalize,Dispose,GC。

一、Finalize方法(C#中是析构函数,如下称析构函数)是用于释放非托管资源的,而托管资源会由GC自动回收。因此,咱们也能够这样来区分托管和非托管资源。全部会由GC自动回收的资源,就是托管的资源,而不能由GC自动回收的资源,就是非托管资源。在咱们的类中直接使用非托管资源的状况不多,因此基本上不用咱们写析构函数。

二、大部分的非托管资源会给系统带来不少负面影响,例如数据库链接不被释放就可能致使链接池中的可用数据库链接用尽。文件不关闭会致使其它进程没法读写这个文件等等。

实现模型:
一、因为大多数的非托管资源都要求能够手动释放,因此,咱们应该专门为释放非托管资源公开一个方法。实现IDispose接口的Dispose方法是最好的模型,由于C#支持using语句快,能够在离开语句块时自动调用Dispose方法。

二、虽然能够手动释放非托管资源,咱们仍然要在析构函数中释放非托管资源,这样才是安全的应用程序。不然若是由于程序员的疏忽忘记了手动释放非托管资源,那么就会带来灾难性的后果。因此说在析构函数中释放非托管资源,是一种补救的措施,至少对于大多数类来讲是如此。

三、因为析构函数的调用将致使GC对对象回收的效率下降,因此若是已经完成了析构函数该干的事情(例如释放非托管资源),就应当使用SuppressFinalize方法告诉GC不须要再执行某个对象的析构函数。

四、析构函数中只能释放非托管资源而不能对任何托管的对象/资源进行操做。由于你没法预测析构函数的运行时机,因此,当析构函数被执行的时候,也许你进行操做的托管资源已经被释放了。这样将致使严重的后果。

五、(这是一个规则)若是一个类拥有一个实现了IDispose接口类型的成员,并建立(注意是建立,而不是接收,必须是由类本身建立)它的实例对象,则这个类也应该实现IDispose接口,并在Dispose方法中调用全部实现了IDispose接口的成员的Dispose方法。
只有这样的才能保证全部实现了IDispose接口的类的对象的Dispose方法可以被调用到,确保能够手动释听任何须要释放的资源。程序员

相关文章
相关标签/搜索