Это шаблон IDisposable
. Если вы хотите динамически изменить код, запускаемый Dispose
, используйте делегат, например,
sealed class DelegatedDisposable : IDisposable {
readonly Action disposer;
void IDisposable.Dispose() { disposer(); }
public DelegatedDisposable(Action onDispose) { disposer = onDispose; }
}
Вам может подойти простая оболочка, в которой вы храните объект, подлежащий утилизации:
sealed class WrappedDisposable<T> : IDisposable where T : IDisposable {
readonly Action<T> onDispose;
readonly T wrappedDisposable;
public WrappedDisposable(T disposable, Action<T> callOnDispose) {
if(disposable == null) throw new ArgumentNullException("disposable");
if(callOnDispose == null) throw new ArgumentNullException("callOnDispose");
wrappedDisposable = disposable;
onDispose= callOnDispose;
}
void IDisposable.Dispose() {
try{ onDispose(wrappedDisposable); }
finally { wrappedDisposable.Dispose(); }
}
}
Если вы хотите выполнить код перед сборкой мусора, вам необходимо реализовать финализатор, который в C # выглядит как закрытый конструктор с ~
перед именем. Как правило, вам не нужно делать это, если вы не управляете собственными ресурсами вручную (т. Е. Вызвали собственное malloc
распределение блокировки или еще много чего).