using System; using System.Collections.Generic; using System.Diagnostics; namespace JD.Kernel.Classes { /// /// Simple class that implements IDisposable using a delegate. /// /// /// Can be useful to implement a "using pattern" without defining a nested class. /// /// /// /// public class MyClass /// { /// public IDisposable Start() /// { /// return new DisposableHelper(delegate /// { /// // ... End code. /// }); /// } /// } /// /// using (MyClass.Start()) /// { /// ... /// } /// /// public class DisposableHelper : IDisposable { private Action m_disposeAction; /// /// Ctor. /// /// Action to execute on dispose (if null, empty action). public DisposableHelper(Action disposeAction) { m_disposeAction = disposeAction; } #region IDisposable Members /// /// Executes its dispose operation. /// [DebuggerStepThrough] public void Dispose() { Action disposeAction = m_disposeAction; m_disposeAction = null; if (disposeAction != null) { disposeAction(); } } #endregion #region Functions /// /// Disposes the value if not null. /// /// public static void SafeDispose(IDisposable value) { if (value != null) { value.Dispose(); } } /// /// Disposes the value if not null. /// /// public static void SafeDisposeList(IEnumerable list) where T : IDisposable { if (list == null) { return; } foreach (var item in list) { SafeDispose(item); } } public static void SafeDisposeAndClearList(ICollection list) where T : IDisposable { if (list == null) { return; } foreach (var item in list) { SafeDispose(item); } list.Clear(); } /// /// Disposes the value if not null. /// /// public static void SafeDispose(T value) where T : IDisposable { if (!Equals(value, null)) { value.Dispose(); } } /// /// Disposes the value if not null and sets it to null. /// /// public static void SafeDispose(ref T value) where T : IDisposable { if (!Equals(value, null)) { // value will still be default(T) even if implementation of Dispose accesses value! T temp = value; value = default(T); temp.Dispose(); } } #endregion } }