/// <summary> ?/// Dispose Pattern ?/// </summary> ?/// <remarks> ?/// 由逻辑可知: ?/// 1.不管是手动调用Dispose方法还是系统自动调用析构函数,均会执行【非托管资源】释放程序 ?/// 2.系统自动调用析构函数时,不会执行【托管资源】释放程序 ?/// </remarks> ?public class DisposableObject : IDisposable ?{ ???/// <summary> ???/// 获取或设置一个值。该值指示资源已经被释放。 ???/// </summary> ???private bool _disposed; ???/// <summary> ???/// 执行与释放或重置非托管资源相关的应用程序定义的任务。 ???/// </summary> ???public void Dispose() ???{ ?????Dispose(true); ?????// 指示GC不要调用此对象的Finalize方法 ?????GC.SuppressFinalize(this); ???} ???/// <summary> ???/// 关闭此对象使用的所有资源。 ???/// </summary> ???/// <remarks> ???/// 1.有时候特定的名称比Dispose更合适,比如文件封装,网络连接封装等 ???/// 2.此方法不要设计为 virtual,子类不应该重写该方法。 ???/// </remarks> ???public void Close() ???{ ?????Dispose(); ???} ???/// <summary> ???/// 由终结器调用以释放资源。 ???/// </summary> ???~DisposableObject() ???{ ?????Dispose(false); ???} ???public void DoSomething() ???{ ?????if (_disposed) throw new ObjectDisposedException("无法访问已经释放的资源。"); ?????// TODO somethings ???} ???/// <summary> ???/// 执行与释放或重置非托管资源相关的应用程序定义的任务。 ???/// 派生类中重写此方法时,需要释放派生类中额外使用的资源。 ???/// </summary> ????protected virtual void Dispose(bool disposing) ???{ ?????if (_disposed) ?????{ ???????return; ?????} ?????if (disposing) ?????{ ???????// TODO 清理托管资源 ??????} ?????// TODO 1.清理非托管资源 ?2.将大对象设置为null ?????_disposed = true; // 标记已经被释放。 ???} ?}
.NET Dispose模式的实现
原文地址:https://www.cnblogs.com/WinHEC/p/Dispose_Pattern_In_CSharp.html