C#中dispose的标准模式是写两个dispose方法,一个是公有的不带参数的dispose()方法,一个是私有的带布尔参数的dispose(bool disposing)方法.一个例子如下:
public class DisposeTest:IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
} private void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// 释放托管资源
}
// 释放非托管资源
}
disposed = true;
}
~DisposeTest()
{
Dispose(false);
} }我的疑问在于Dispose(true)和Dispose(false)的区别上。我查阅过很多资料,所有的资料上都如下所述“当用户显示调用Dispose()方法时,要清理托管资源和非托管资源,并且调用GC.SuppressFinalize方法阻止垃圾收集器再次调用Finalise方法;当用户没有调用Dispose()方法,而是由垃圾收集器调用Finalize方法时,应该只释放非托管资源,因为假若在Finalize方法中引用另一个托管对象时,我们无法确定此时该托管对象的状态如何(是否已被回收)。”我非常不明白的是为什么Finalize方法中不能含有托管类型的引用,按照他们说的,“无法确定此时该托管对象的状态如何”,那么对于其他方法而言,它们里面为什么可以含有其他托管类型的引用,求大侠不吝赐教!!!!
public class DisposeTest:IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
} private void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// 释放托管资源
}
// 释放非托管资源
}
disposed = true;
}
~DisposeTest()
{
Dispose(false);
} }我的疑问在于Dispose(true)和Dispose(false)的区别上。我查阅过很多资料,所有的资料上都如下所述“当用户显示调用Dispose()方法时,要清理托管资源和非托管资源,并且调用GC.SuppressFinalize方法阻止垃圾收集器再次调用Finalise方法;当用户没有调用Dispose()方法,而是由垃圾收集器调用Finalize方法时,应该只释放非托管资源,因为假若在Finalize方法中引用另一个托管对象时,我们无法确定此时该托管对象的状态如何(是否已被回收)。”我非常不明白的是为什么Finalize方法中不能含有托管类型的引用,按照他们说的,“无法确定此时该托管对象的状态如何”,那么对于其他方法而言,它们里面为什么可以含有其他托管类型的引用,求大侠不吝赐教!!!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货