在MSDN上看到两个需要显式dispose的例子。我的理解,这两个例子里如果不调用Dispose是有问题的。 第一个是Timer类, MSDN上说 "If you are making a lot of Timers that only fire once, take care to call Dispose() on them after you are finished. If you don't, garbage collection will never clean them up, even after their job has finished. You can safely dispose of a Timer object inside the Elapsed event handler if you need to." 来源http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx第二个是Font Class,虽然没有说必须要调用Dispose方法,但Font类的例子里使用完是调用了Dispose的。同样的有Brush, Pen. 来源http://msdn.microsoft.com/en-us/library/5af3hke9.aspx
2. 每次用完都显式调用该对象Dispose()方法
谢谢2楼!对于3,很多系统类都有dispose,比如Font, Dataset。在使用这些对象时怎么做才是合适的?
如果不使用Using则必需调用Dispose方法。你可以不用这两种方式,程序也不会有很明显的问题,但是这些对象的非托管资源不会被释放。
那么我使用C#的File, Font, Brush, Dataset...这些类的对象后是否必须用1或2的方式?
即在析构函数中调用 Dispose(true);
来释放非托管代码和资源。可查阅MSDN中的“析构函数”。一个简单的例子。
有一个类的实例,在构造函数或其它函数中打开了的一个串口。为了防止此实例消亡后(如果未关闭串口)。串口还可供其它实例可用。那么最好在Dispose中判断一下,如果串口被占用,则关闭它。
--------------------
是的。不用是不正确的。
析构释放托管资源 是自动调用非托管资源析构函数释放不了 只有自己在类里实现dispose去释放 你写成别的名字的方法释放资源也是一样的,只是不能再using的时候自动调用而已
{
Dispose(true); //既释放托管资源,也释放非托管资源
Gc.SuppressFinalize(this); //告诉GC回收对象时不必调用~ClassName()了,因为Dispose(true)已经把事情做完了
}
~ClassName() //这个方法由GC回收对象时自动调用
{
Dispose(false); //释放非托管资源
}
Protected virtual void Dispose(bool disposing)
{
if (disposing)
{//释放托管资源
managedResource.Dispose();
}
//释放非托管资源
}
释放非托管资源用dispose之所以在dispose的时候重写析构函数是为了防止你忘记用using又没有显示调用的时候仍然能够释放托管资源。
这样应该清楚了吧
但有一些情况下(如有限的资源或容易引起竞争的资源)建议人工dispose,就是如数据使用时最好自己dispose
第一个是Timer类, MSDN上说
"If you are making a lot of Timers that only fire once, take care to call Dispose() on them after you are finished. If you don't, garbage collection will never clean them up, even after their job has finished.
You can safely dispose of a Timer object inside the Elapsed event handler if you need to."
来源http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx第二个是Font Class,虽然没有说必须要调用Dispose方法,但Font类的例子里使用完是调用了Dispose的。同样的有Brush, Pen.
来源http://msdn.microsoft.com/en-us/library/5af3hke9.aspx
-------------------------------------------------------------------------------
在AccessImport项目中,所使用的DataSet都是由SqlDataAdapter生成的(不是动态)。数据表发现很多重复数据,追了很久才查到原因:DataSet在从新写入数据时没有清空,如果此时Fill的话,只是在以前的数据后面追加数据,如果该表没有主键,在insert的时候就会再次写入以前的数据。所以建议在使用sqlDataAdapter.Fill(DataSet)之前,先把DataSet清空一下:DataSet.clear()。在使用完之后,最好把DataSet的资源释放掉:DataSet.dispose()。
http://www.cnblogs.com/dusy/archive/2007/08/24/868068.html