Mercurial > pub > ImplabNet
view Implab/Components/Disposable.cs @ 266:254d1f255d87 v3
Добавлена метка v3.0.10 для набора изменений 74e048cbaac8
author | cin |
---|---|
date | Mon, 16 Apr 2018 19:45:18 +0300 |
parents | 6f4630d0bcd9 |
children |
line wrap: on
line source
using Implab.Diagnostics; using System; using System.Diagnostics.CodeAnalysis; using System.Threading; namespace Implab.Components { /// <summary> /// Base class the objects which support disposing. /// </summary> public class Disposable : IDisposable { public event EventHandler Disposed; public bool IsDisposed { get; private set; } /// <summary> /// Asserts the object is not disposed. /// </summary> /// <exception cref="ObjectDisposedException">The object is disposed</exception> /// <remarks> protected void AssertNotDisposed() { if (IsDisposed) throw new ObjectDisposedException(ToString()); } /// <summary> /// Вызывает событие <see cref="Disposed"/> /// </summary> /// <param name="disposing">Признак того, что нужно освободить ресурсы, иначе данный метод /// вызван сборщиком мусора и нужно освобождать ТОЛЬКО неуправляемые ресурсы ТОЛЬКО этого /// объекта.</param> /// <remarks> /// Данный метод вызывается гарантированно один раз даже при одновременном вызове <see cref="Dispose()"/> /// из нескольких потоков. /// </remarks> protected virtual void Dispose(bool disposing) { if (disposing) Disposed.DispatchEvent(this, EventArgs.Empty); } [SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly", Justification = "Dipose(bool) and GC.SuppessFinalize are called")] public void Dispose() { if(!IsDisposed) { IsDisposed = true; Dispose(true); GC.SuppressFinalize(this); } } ~Disposable() { Dispose(false); } } }