Лично я бы не стал зацеплять / отцеплять событие в конструкторе и избавляться. Вместо этого я бы добавил код в методы доступа get / set View и добавил их туда. Но если докладчик удаляется, когда привязан вид, я бы не стал пытаться его очистить. Вы можете явно отсоединить представление от докладчика, если вам необходимо явное отсоединение.
Сказав это, вот что я знаю о IDisposable.
Рекомендуемый подход к реализации IDisposable заключается в использовании защищенного метода Dispose (bool), в котором вы выполняете действие. Причина в том, что вы хотите различать явное удаление и удаление, вызванное завершением (сборкой мусора).
Когда вы удаляетесь из-за явного вызова Dispose (), можно трогать управляемые объекты, и вы должны утилизировать все, что вы создали, что также требует удаления. Таким образом, вы делаете это только при удалении = true.
Но если кто-то (вы) забывает вызвать Dispose и вызывается финализатор, вы удаляетесь после сборки мусора (dising = false) и не хотите трогать какие-либо управляемые объекты, потому что они могут быть уже завершены. В этом случае вам нужно освободить только неуправляемые ресурсы, такие как дескрипторы Win32 и т. Д.
Наконец, когда явно вызывается Dispose (), вы заметите, что я вызвал GC.SupressFinalize (this), который является подсказкой производительности для сборщика мусора. Это позволяет ему знать, что объект не должен быть завершен, когда он собран. Завершение не дешево.
class MyObject : IDisposable {
~MyObject() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
GC.SupressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
// dispose of managed resources
}
// dispose of unmanaged resources
}
}