Существует много информации о "стандартной полной" реализации IDisposable для утилизации ресурсов, управляемых UNmanaged, но на самом деле этот случай (очень) редок (большинство ресурсов уже завернуты управляемыми классами). Этот вопрос фокусируется на некорректной реализации IDisposed для гораздо более распространенного случая с "управляемыми ресурсами".
1: Является ли реализация mimimal IDisposable в коде ниже правильной, есть ли проблемы?
2: Есть ли какая-нибудь причина для добавления полной стандартной IDisposable implimentation (Dispose(), Dispose (bool), Finalizer и т.д.) над представленной минимальной импликацией?
3: Оправдано ли это в этом минимальном случае, чтобы сделать Dispose виртуальным (поскольку не предоставляли Dispose (bool))?
4: Если эта минимальная реализация заменяется полной стандартной реализацией, которая включает (бесполезный, в данном случае) финализатор - это изменяет, как GC обрабатывает объект? Есть ли недостаток?
5: пример включает в себя таймеры и обработчики событий, поскольку эти случаи особенно важны, чтобы не пропустить, поскольку отказ от их использования будет сохранять объекты в живых и ногами ('this' в случае Timer, eventSource в случае обработчика событий) до тех пор, пока GC обходит их в свое время. Есть ли другие примеры, подобные этим?
class A : IDisposable {
private Timer timer;
pubic A(MyEventSource eventSource) {
eventSource += Handler
}
private void Handler(object source, EventArgs args) { ... }
public virtual void Dispose() {
timer.Dispose();
if (eventSource != null)
eventSource -= Handler;
}
}
class B : A, IDisposable {
private TcpClient tpcClient;
public override void Dispose() {
(tcpClient as IDispose).Dispose();
base.Dispose();
}
}
рефов:
MSDN
SO: Когда мне нужно управлять управляемыми ресурсами
SO: Как удалить управляемый ресурс в методе Dispose() на С#
SO: Dispose() для очистки управляемых ресурсов