|
- using System;
- using System.ComponentModel;
- //下面的例子演示了如何创建
- //实现IDisposable接口的资源类
- //和IDisposable。处理方法。
- public class DisposeExample
- {
- //实现IDisposable的基类。
- //通过实现IDisposable,你宣布
- //这种类型的实例分配稀缺资源。
- public class MyResource: IDisposable
- {
- // 指向外部非托管资源的指针。
- private IntPtr handle;
- // 该类使用的其他托管资源。
- private Component component = new Component();
- // 跟踪是否调用了Dispose。
- private bool disposed = false;
- //类的构造函数。
- public MyResource(IntPtr handle)
- {
- this.handle = handle;
- }
- //实现IDisposable。
- //不要将此方法设为虚方法。
- //派生类不能重写此方法。
- public void Dispose()
- {
- Dispose(disposing: true);
- //该对象将被Dispose方法清除。
- //因此,应该调用GC。SuppressFinalize来将此对象从终结队列中移除
- //并阻止此对象的终结代码从执行第二次。
- GC.SuppressFinalize(this);
- }
- //在两个不同的场景中执行Dispose(bool Dispose)。
- //如果dispose = true,则直接调用了该方法
- //或间接地由用户的代码。受管资源和非受管资源
- //可以处理。
- //如果dispose = false,则该方法已被
- //终止器内部的运行时,你不应该引用
- //其他对象。只能处置非托管资源。
- protected virtual void Dispose(bool disposing)
- {
- //检查是否已经调用了Dispose。
- if(!this.disposed)
- {
- //如果处置等于true,处置所有已管理的非托管资源。
- if(disposing)
- {
- // 处置托管资源。
- component.Dispose();
- }
- //调用适当的方法进行清理
- //这里的非托管资源。
- //如果处置为false,
- //只执行以下代码。
- CloseHandle(handle);
- handle = IntPtr.Zero;
- //处理完成。
- disposed = true;
- }
- }
- //使用interop调用必要的方法清理非托管资源。
- [System.Runtime.InteropServices.DllImport("Kernel32")]
- private extern static Boolean CloseHandle(IntPtr handle);
- //使用c#终结器语法来终结代码。
- //只有当Dispose方法被调用时,这个终结器才会运行
- //不被调用。
- //它给基类一个完成的机会。
- //不要在该类派生的类型中提供终结器。
- ~MyResource()
- {
- //不要在这里重新创建Dispose清理代码。
- //调用Dispose(Dispose: false)是最优的
- //可读性和可维护性。
- Dispose(disposing: false);
- }
- }
- public static void Main()
- {
- //在这里插入代码创建
- //并使用MyResource对象。
- }
- }
复制代码
来源:https://www.cnblogs.com/kitthe/p/18578848
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|