Ich habe eine übergeordnete und untergeordnete Klasse, die beide IDisposable
implementieren müssen. Wohin sollen virtual
(und base.Dispose()
?) Anrufe ins Spiel kommen? Wenn ich gerade den Dispose(bool disposing)
Anruf außer Kraft setze, fühlt es sich wirklich merkwürdig an, dass ich IDisposable
ohne ausdrückliche Dispose()
Funktion einführe (nur die geerbte verwendend), aber alles andere.Implementierung von IDisposable für eine Unterklasse, wenn das übergeordnete Element auch IDisposable implementiert
Was ich getan hatte (trivialisiert ziemlich viel):
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);
}
}
[Msdn] (https://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx0) hat Empfehlungen, wie Objekte zu Unterklasse IDisposable Implementierung . – PeterM