Implementieren von IDisposable für eine Unterklasse, wenn das übergeordnete Element IDisposable ebenfalls implementiert
Ich habe eine Eltern und Kind-Klasse, die beide implementiert werden müssen IDisposable
. Wo sollte virtual
(und base.Dispose()
?) Anrufe ins Spiel kommen? Wenn ich nur das überschreiben der Dispose(bool disposing)
nennen, es fühlt sich wirklich seltsam, die besagt, dass ich implementieren IDisposable
ohne eine explizite Dispose()
- Funktion (nur unter Verwendung der geerbt), aber alles andere.
Was ich getan hatte (verharmlost ganz ein bisschen):
internal class FooBase : IDisposable
{
Socket baseSocket;
private void SendNormalShutdown() { }
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
SendNormalShutdown();
}
baseSocket.Close();
}
}
~FooBase()
{
Dispose(false);
}
}
internal class Foo : FooBase, IDisposable
{
Socket extraSocket;
private bool _disposed = false;
protected override void Dispose(bool disposing)
{
if (!_disposed)
{
extraSocket.Close();
}
base.Dispose(disposing);
}
~Foo()
{
Dispose(false);
}
}
InformationsquelleAutor der Frage Tanzelax | 2010-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist etwas, Sie sollten nicht besorgt sein.
Wenn Sie eine Unterklasse einer Klasse IDisposable, die alle die "Dispose-Muster" Sanitär-ist bereits behandelt werden, für die Sie von der Basisklasse. Sie sollte wirklich nichts zu tun, sondern überschreiben Sie die
protected Dispose(bool)
Methode, und verfolgen, ob Sie schon entsorgt, schon ordentlich anzuhebenObjectDisposedException
.)Für details, siehe meinen blog-post auf Erben von einer Klasse IDisposable.
Auch, es ist oft eine gute Idee zu prüfen, welche die IDisposable-Klasse anstelle von Unterklassen. Es gibt Zeiten, wenn Unterklassen einer Klasse IDisposable ist angemessen, aber Sie sind eher selten. Kapselung ist oft die bessere alternative.
InformationsquelleAutor der Antwort Reed Copsey
Warum die Dinge zu komplizieren, wenn Sie nicht müssen?
Da Sie nicht Kapseln alle nicht verwalteten Ressourcen, die Sie nicht brauchen, alle, mucking mit der Finalisierung. Und, Ihre Klassen sind interne, was darauf schließen lässt, dass Sie die Kontrolle der Vererbungshierarchie innerhalb der eigenen assembly.
So, die geradewegs Ansatz wäre:
Sogar, wenn Sie nicht verwalteten Ressourcen, würde ich sagen, du bist viel besser dran, encapsulating diese in Ihre eigenen Einweg-Klasse und verwenden Sie Sie, wie Sie würde jede andere Einweg; als unkompliziert wie der code oben.
InformationsquelleAutor der Antwort Jordão
Die Idee dieses Musters ist, dass Sie das überschreiben der virtuellen
Dispose
Methode aufrufenbase.Dispose
wenn nötig. Die Basisklasse kümmert sich um den rest, den Aufruf der virtuellen Methode Dispose (und damit die korrekte Umsetzung). Die Unterklasse sollte nicht müssen, auch umzusetzenIDisposable
(es istIDisposable
via Vererbung)InformationsquelleAutor der Antwort spender
Die untergeordnete Klasse sollte das überschreiben der virtuellen Entsorgen, führen Sie die Entsorgung auf die spezifische Unterklasse, und rufen Sie die Superklasse' Entsorgen, was wiederum Ihre eigene Arbeit.
EDIT: http://davybrion.com/blog/2008/06/disposing-of-the-idisposable-implementation/ ist das Muster, das ich in solchen Fällen anwenden. Nicht das 'Einweg' - Klasse speziell, aber die Erbschafts-und überschreibt.
InformationsquelleAutor der Antwort Grant Palin
Ich immer an Joe Duffy ist sehr in-depth-Studie auf dieses Muster. Für mich seine version des Evangeliums.
http://joeduffyblog.com/2005/04/08/dg-update-dispose-finalization-and-resource-management/
Ist die erste Sache zu erinnern ist, dass ein finalizer ist nicht notwendig die meiste Zeit. Es ist für Aufklärung, nicht verwaltete Ressourcen, wo Sie direkt holding native Ressourcen, d.h. nur Ressourcen, die nicht Ihre eigenen finalizer.
Hier ist ein Beispiel für eine Basis-Klasse-Unterklasse-pair-Mädchen.
Beachten Sie, dass die Unterklasse hat seine eigene _isDisposed Mitglied. Beachten Sie auch null-Prüfung auf die Ressourcen, da Sie nicht möchten, dass alle Ausnahmen, die in diese Blöcke.
Lukas
InformationsquelleAutor der Antwort Luke Puplett