Disposables (english version)
Эта библиотека помогает сделать объекты высвобождаемыми быстрым, коротким, простым и безопасным способом.
Абстрактный класс Platform.Disposables.DisposableBase
пытается удалить объект, даже если метод Dispose
нигде не вызывался пользователем, либо при вызове деструктора экземпляра, либо при возникновении события OnProcessExit
, в зависимости от того, что произойдет раньше. И позаботится о том, чтобы логика удаления по умолчанию выполнялась только один раз, но, если она вам действительно нужна, вы можете разрешить несколько вызовов и попыток удаления, переопределив соответствующие свойства.
Интерфейс Platform.Disposables.IDisposable
расширяет System.IDisposable
добавляя свойство IsDisposed
и метод Destruct
. Метод Destruct
предназначен для того, чтобы не генерировать исключения, что делает его безопасным для использования в деструкторах классов. Все игнорируемые исключения доступны в Platform.Disposables.IgnoredDisposables
, если вам нужно их отладить.
Пространство имён: Platform.Disposables
Ответвление от: Konard/LinksPlatform/Platform/Platform.Helpers/Disposables
Пакет в NuGet: Platform.Disposables
Примеры
Если вы можете использовать наследование в вашем классе. Например, если у вас нет другого наследуемого базового класса.
using Platform.Disposables;
namespace Examples
{
public class DisposableBaseUsageExample : DisposableBase
{
protected override void Dispose(bool manual, bool wasDisposed)
{
// Логика высвобождения
}
}
}
Если вы не можете использовать наследование в вашем классе. Например, если у вас есть другой базовый класс от которого унаследован ваш класс.
using Platform.Disposables;
namespace Examples
{
public class DisposableUsageExample : System.IDisposable
{
private readonly Disposable _disposable;
public DisposableUsageExample() => _disposable = new Disposable(Disposed);
public void Dispose() => _disposable.Dispose();
~DisposableUsageExample() => _disposable.Destruct();
private void Disposed(bool manual, bool wasDisposed)
{
// Логика высвобождения
}
}
}
Если у вас нет доступа к внутренней структуре класса объекта. Вы можете использовать высвобождаемый контейнер для вашего объекта. Контейнер может быть преобразован обратно в переданный объект в любое время.
using Platform.Disposables;
namespace Examples
{
public class Examples
{
public static void UseAndDispose()
{
var array = new int[] { 1, 2, 3 };
Disposable<int[]> disposableArray = (array, () => array = null);
WorkWithObjectAndDispose(disposableArray);
// Здесь array == null
}
private static void WorkWithObjectAndDispose(Disposable<int[]> disposableArray)
{
using (disposableArray)
{
int[] array = disposableArray;
// Используйте ваш объект здесь
} // Здесь вызывается () => array = null
}
}
}
Документация
- Интерфейс IDisposable.
- Абстрактный класс DisposableBase.
- Класс Disposable.
- Класс Disposable<T>.
PDF файл с кодом для электронных книг.