/// <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; // 标记已经被释放。 } }
原文地址:https://www.cnblogs.com/WinHEC/p/Dispose_Pattern_In_CSharp.html
时间: 2024-10-08 18:25:12