C#中关于资源释放的问题dispose
C#中非托管对象都需要手动释放内存,但是为什么有的托管对象也可以手动释放,既然托管对象GC会自动回收,那C#为什么还提供Dispose 方法,举个例子,当使用Pen 类创建一个对象后,在使用完成之后,需要对其Dispose,但是有时候我们自定义的类自己确不能够自动释放,包括一些基本类型的变量,那么在以后的开发中到底哪些是需要注意手动释放的,哪些可以等待GC,还有就是一直不大明白当调用窗体的Close 方法后,运行到 Dispose(bool disposing)方法后,这个bool类型的参数是怎么传进来的, base.Dispose(disposing);这个方法具体是怎么实现的……
[解决办法]
对于.net平台的对象,也就是对于那些支持GC的对象,你不知道所谓 Dispose 的具体内涵是,就不要画蛇添足地去调用它。
你可以打开.net的源代码,看看任何一个具有(或者父类型具有) IDisposeable 接口的程序是怎样实现的。就算是.net framework是许多实习的大学生参与开发的,但是微软的产品经理们可不是什么实习生,(当时)微软的老板不是只会搞推销业务的软件研发外行,所以.net framework产品在类似的基础方面非常一致、清晰、千锤百炼。
.net框架中所有的这类对象,在 protected virtual void Finalize() 重写方法中都会调用 Dispose 方法。因此你无需写什么Dispose,在GC调用 Finalize 方法的时候也就会自动调用 Dispose。因此胡乱地“手动释放”除了会让程序变得缓慢,也没有什么好处。同时反过来说,在所有的Dispose方法的实现中,通常又会写
GC.SuppressFinalize(this);这样的语句。因为一旦你手动调用过Dispose方法,那么它就告诉GC没有必要再调用Dispose方法了!
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
[解决办法]
Pen这些,都是有非托管资源的,所以需要Dispose。这些东西都是对应GDI句柄的。