c# finalize 和 dispose
时间:2010-12-18 来源:wuye_chinaunix
c# finalize 就是析构函数,即destructor;
dispose 是设计为了主动释放非托管资源(同时也可以释放包含的托管资源使用的非托管资源)。
dispose是主动释放,一般用using语法可以代为实现
finalize是GC 来调用,时间和顺序不可预知。
为了及时释放非托管资源,我们利用dispose。
在finalize中我们需要注意,不要调用释放相关托管资源的dispose,因为这个时候相关托管资源的状态不可预知。
托管资源的释放有2个阶段; 第一个阶段调用finalize,进行主动清理, 第二个阶段真正释放占用内存。
如果我们不需要主动释放或清理动作,我们可以使用GC.SuppressFinalize(this) 来忽略此过程,节省。
using System;
public class ResourceHolder : IDisposable
{
private bool isDisposed = false;
//主动调用释放资源的dispose(using)
public void Dispose()
{
Dispose(true); //true参数表明可以把包含的托管资源的dispose进行调用
GC.SuppressFinalize(this); //dipose后告诉GC不需要再调用finalize了
}
protected virtual void Dispose(bool disposing)
{
if (!isDisposed) //如果没有dispose过
{
if (disposing) //如果真表明需要主动释放相关非托管资源
{
// Cleanup managed objects by calling their Dispose() methods.
}
//释放非托管资源
// Cleanup unmanaged objects
}
isDisposed = true; //指示已经dipose过了
}
//被GC调用了的析构函数
~ResourceHolder()
{
Dispose (false);
}
public void SomeMethod()
{
// Ensure object not already disposed before execution of any method
if(isDisposed)
{
throw new ObjectDisposedException(“ResourceHolder”);
}
// method implementation …
}
}
dispose 是设计为了主动释放非托管资源(同时也可以释放包含的托管资源使用的非托管资源)。
dispose是主动释放,一般用using语法可以代为实现
finalize是GC 来调用,时间和顺序不可预知。
为了及时释放非托管资源,我们利用dispose。
在finalize中我们需要注意,不要调用释放相关托管资源的dispose,因为这个时候相关托管资源的状态不可预知。
托管资源的释放有2个阶段; 第一个阶段调用finalize,进行主动清理, 第二个阶段真正释放占用内存。
如果我们不需要主动释放或清理动作,我们可以使用GC.SuppressFinalize(this) 来忽略此过程,节省。
using System;
public class ResourceHolder : IDisposable
{
private bool isDisposed = false;
//主动调用释放资源的dispose(using)
public void Dispose()
{
Dispose(true); //true参数表明可以把包含的托管资源的dispose进行调用
GC.SuppressFinalize(this); //dipose后告诉GC不需要再调用finalize了
}
protected virtual void Dispose(bool disposing)
{
if (!isDisposed) //如果没有dispose过
{
if (disposing) //如果真表明需要主动释放相关非托管资源
{
// Cleanup managed objects by calling their Dispose() methods.
}
//释放非托管资源
// Cleanup unmanaged objects
}
isDisposed = true; //指示已经dipose过了
}
//被GC调用了的析构函数
~ResourceHolder()
{
Dispose (false);
}
public void SomeMethod()
{
// Ensure object not already disposed before execution of any method
if(isDisposed)
{
throw new ObjectDisposedException(“ResourceHolder”);
}
// method implementation …
}
}
相关阅读 更多 +