实现 Dispose 方法
来源:互联网 发布:无线传感器网络定义 编辑:程序博客网 时间:2024/05/16 11:45
类型的 Dispose 方法应该释放它拥有的所有资源。它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源。
Dispose 方法应该为它处置的对象调用 GC.SuppressFinalize方法。如果对象当前在终止队列中,GC.SuppressFinalize 防止其 Finalize 方法被调用。执行 Finalize 方法会大大减损性能。如果您的 Dispose方法已经完成了清理对象的工作,那么垃圾回收器就不必调用对象的 Finalize方法了。
Dispose(bool disposing)以两种截然不同的方案执行。如果“处置”等于“真”,则该方法已由用户的代码直接调用或间接调用,并且可处置托管资源和非托管资源。如果“处置”等于“假”,则该方法已由运行库从终结器内部调用,并且只能处置非托管资源。
基类提供的 Finalize 方法或析构函数在未能调用 Dispose 的情况下充当防护措施。Finalize方法调用带有参数的 Dispose 方法,同时传递“假”。
public classBaseResource: IDisposable
{
// 非托管资源
private IntPtr handle;
// 托管资源
private Component Components;
// Track whether Dispose has been called.
private bool disposed = false;
public BaseResource()
{....}
public void Dispose()
{
Dispose(true);
//因为前面Dispose(true)已经将所有资源全部释放,所以不学要再调用finalize,以节省资源。
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
// 释放托管资源
Components.Dispose();
}// 释放非托管资源
CloseHandle(handle);
handle = IntPtr.Zero;
}
disposed = true;
}
// 这个析构函数在Dispose没有被调用时 才被调用
~BaseResource()
{
Dispose(false);
}
// 使你的Dispose方法被多次调用,但是对象如果已经disposed则将从此处抛出异常
// 任何时候你要用对象去做任何事情你都应该检查该对象是否已经disposed
public void DoSomething()
{
if(this.disposed)
{
throw new ObjectDisposedException();
}
}
}
public classMyResourceWrapper: BaseResource
{
// 托管资源
private ManagedResource addedManaged;
// 非托管资源
private NativeResource addedNative;
private bool disposed = false;
public MyResourceWrapper()
{.... }
protected override void Dispose(bool disposing)
{
if(!this.disposed)
{
try
{
if(disposing)
{
addedManaged.Dispose();
}
CloseHandle(addedNative);
this.disposed = true;
}
finally
{//调用父类的dispose函数
base.Dispose(disposing);
}
}
}
}
- 实现 Dispose 方法
- 实现 Dispose 方法
- 实现 Dispose 方法:
- Dispose模式与Finalize, Dispose方法实现准则
- 【清理非托管资源】实现Dispose方法
- 浅析C# Dispose方法的实现
- Dispose()方法
- Dispose()方法
- Xamarin.Android - 如何实现接口方法 IntPtr Handle 和 Dispose
- 实例 Dispose 方法
- SqlConnection的Dispose()方法
- Finalize,Dispose,SuppressFinalize 方法
- java-dispose()方法
- java中的dispose()方法
- java中的dispose()方法
- .NET 的 Dispose 方法
- java中的dispose()方法
- JAVA-dispose()方法
- C++开发网站
- 选择法(Java语言)
- PE文件学习总结
- 如何学习linux编程
- 比较排序算法的简单复习(说明+代码)
- 实现 Dispose 方法
- 交换法(Java语言)
- SQL 删除表
- 数据链路层转发的简单实现
- C#中Parse和Convert的区别?
- AIX启动卡在0581处?原因很简单...
- 关于DotNet的GC、Dispose
- shell排序(Java语言)
- 无语...