实现一个boolean参数的受保护的Dispose方法。该方法释放类封装的所有非托管资源(如文件句柄)如果传递给受保护的dispose的参数是true,那么也对所有包装非托管资源的类成员)调用close或dispose(从IDisposable中继承的公共dispose
实现.net框架的IDisposable接口,它包含一个不带参数的Dispose方法,通过调用GC.SuppressFinalize实现公共的Dispose,可以防止垃圾回收器调用Finalize,然后调用受保护的Dispose并向它传递true;
重写Finalize.对象被销坏时,垃圾回收器调用Finalize.在Finalize中,调用受保护的Dispose并传递false,这个false参数很重要,因为它可以防止受保护的Dispose对任何封装的Dispose对任何封装类成员(如果垃圾回收器已经运行,那么其中许多成员已经被销毁)调用Close或公共的Dispose,
如果语法上是合理的(如类封装的资源可以以句柄的形式关闭),那么可以实现调用公共Dispose的Close方法:
基于以上的原则,实现一个File类的正确方法如下:
Class file:IDisposable
{
protected Intptr Handle = IntPtr.Zero;
public File(string name)
{
//todo:打开文件并将句柄复制到Handel
}
~file()
{
Dispose(false)
}
public void Dispose()
{
GC.SuppressFinalize(this);
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
//todo:关闭文件句柄
if(disposeing)
//todo 如果类中有包装非托管资源的成员
//在这里对它们调用Close或Dispose
}
}
public void close()
{
Dispose();
}
}关于更详细的说明可以参见NDD(非确定性销毁)
实现.net框架的IDisposable接口,它包含一个不带参数的Dispose方法,通过调用GC.SuppressFinalize实现公共的Dispose,可以防止垃圾回收器调用Finalize,然后调用受保护的Dispose并向它传递true;
重写Finalize.对象被销坏时,垃圾回收器调用Finalize.在Finalize中,调用受保护的Dispose并传递false,这个false参数很重要,因为它可以防止受保护的Dispose对任何封装的Dispose对任何封装类成员(如果垃圾回收器已经运行,那么其中许多成员已经被销毁)调用Close或公共的Dispose,
如果语法上是合理的(如类封装的资源可以以句柄的形式关闭),那么可以实现调用公共Dispose的Close方法:
基于以上的原则,实现一个File类的正确方法如下:
Class file:IDisposable
{
protected Intptr Handle = IntPtr.Zero;
public File(string name)
{
//todo:打开文件并将句柄复制到Handel
}
~file()
{
Dispose(false)
}
public void Dispose()
{
GC.SuppressFinalize(this);
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
//todo:关闭文件句柄
if(disposeing)
//todo 如果类中有包装非托管资源的成员
//在这里对它们调用Close或Dispose
}
}
public void close()
{
Dispose();
}
}关于更详细的说明可以参见NDD(非确定性销毁)
楼上的兄台,我问的是释放static constructor中分配的资源,而不是constructor中分配的资源~