Verwendung des Destruktors / Dispose der Basisklasse?

8

In C #, wie in der Dokumentation erwähnt, und dieser nette Post 's akzeptierte Antwort, es wird gesagt, dass Klassen den Destruktor nicht erben ihre Elternklasse.

Die Frage : Wenn ich sicherstellen möchte, dass die privaten Elemente der Basisklasse entsorgt werden, ist die richtige Methode zum Implementieren von IDisposable in allen untergeordneten Klassen und in der Dispose-Methode base.Dispose ()?

Es sieht in Ordnung aus, aber ich hätte einen Weg vorgezogen, der keine Implementierung in allen untergeordneten Klassen erfordert.

    
Tipx 20.04.2011, 14:48
quelle

4 Antworten

12

MSDN gibt an, dass Destruktoren automatisch bei Basisklassen aufgerufen werden.

    
Nik 20.04.2011, 14:52
quelle
6

Sie sollten dem Wegwerfmuster folgen. Es sorgt auch für die Vererbung.

Der interessante Teil hier ist "Destruktoren erben nicht", ich bin mir nicht sicher, was ich davon halten soll. Ich habe einen kleinen Test geschrieben, aber zu meiner Erleichterung muss man nur einen Destruktor in der Basisklasse schreiben.

Damit sind die Kinder von den unmanaged Ressourcen der Basisklasse abgekoppelt. Sie können Dispose(bool) überschreiben, um ihre eigenen Angelegenheiten zu bereinigen.

Aber ich habe einen Kommentar abgegeben, weil ich zu viele Programmierer sehe, die das vollständige Muster implementieren, nur um verwaltete Ressourcen zu handhaben.

Aus einer allgemeinen Designperspektive wäre eine Einwegklasse besser versiegelt.

    
Henk Holterman 20.04.2011 15:23
quelle
0

Die Basisklasse sollte das Standard-IDisposable-Muster verwenden Basisklassen - auf diese Weise benötigt nur die Basisklasse einen Finalizer und abgeleitete Klassen überschreiben einfach die virtuelle Methode

%Vor%     
Joe 20.04.2011 15:25
quelle
0

Wenn die Elternklasse das IDisposable-Muster von Microsoft verwendet, sollte die Kindklasse Dispose (void) nicht überschreiben, sondern stattdessen Dispose (Boolean Disposing) überschreiben. Wenn sie mit Disposed true aufgerufen wird, sollte sie die untergeordnete Klasse ablegen und base.Dispose (True) aufrufen. Wenn mit Disposed false aufgerufen wird, sollte es in den meisten Fällen nichts außer call base.Dispose (False) geben.

Beachten Sie, dass der Aufruf von base.Dispose (False) in den meisten Fällen nichts unternimmt, aber trotzdem durchgeführt werden sollte. Wenn die untergeordnete Klasse zusätzliche "nicht verwaltete Ressourcen" hinzufügen müsste (d. H. Wenn sie zusätzliche Verantwortlichkeiten hat, die in einem Finalisierer ausgeführt werden müssen), sollte sie diese Verantwortlichkeiten normalerweise in ein anderes Objekt einkapseln. Beachten Sie, dass die Frage, ob eine Klasse einen Finalizer hat, nicht nur ein "Implementierungsdetail" ist. das Hinzufügen eines Finalizers zu einer Basisklasse kann eine bahnbrechende Änderung sein, die ein Programm verursacht, das Ressourcen (schlecht, aber möglicherweise überlebensfähig, wenn das Programm nicht zu lange ausgeführt wird) in eine, die zu zufälligen Anlässen führen wird , versuchen, Ressourcen zu bereinigen, die noch immer verwendet werden (dies wird nicht oft zu Problemen führen, aber zu seltenen, aber sofortigen Fehlern führen).

    
supercat 20.04.2011 15:29
quelle