Angenommen implementieren, dass ich die folgenden Klassen:Wie Sie sich richtig Einweg-Muster mit Bibliotheken von Drittanbietern
class Foo : IDisposable
{
public void Dispose()
{
bar.Dispose();
}
private Bar bar = new Bar();
}
class Bar : IDisposable
{
public void Dispose()
{
baz.Dispose();
}
private SomeThirdPartyLibraryClass baz = new SomeThirdPartyLibraryClass();
}
Dieser Code funktioniert gut, wenn using
Anweisung:
using (Foo foo = new Foo())
{
// ...
}
// All resources should be disposed at this time
jedoch für einige, wenn Grund Benutzer dieser Klasse vergessen, using
Anweisung zu verwenden, Ressourcen werden nie entsorgt werden.
Laut MSDN, sollte ich Einweg-Muster auf die folgende Weise implementieren:
class Foo : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing) {
// Free any managed objects here.
//
}
// Free any unmanaged objects here.
//
disposed = true;
}
~Foo()
{
Dispose(false);
}
bool disposed = false;
private Bar bar = new Bar();
}
(das gleiche gilt für Bar
)
Aber wo genau soll ich bar.Dispose();
und baz.Dispose();
Code platzieren?
Sollte es unter "verwaltete Aufräumarbeiten" oder unter "nicht verwaltete Aufräumarbeiten" sein?
Wie der Name schon sagt, weiß ich nicht die Implementierung von SomeThirdPartyLibraryClass
(und auf jeden Fall kann es im Laufe der Zeit geändert werden).
Was soll ich dann tun?
Wo auf MSDN empfiehlt es, einen Finalizer als Teil einer generischen IDisposable-Implementierung zu verwenden? – stuartd
Mögliches Duplikat von [Ist es möglich, die Verwendung von "using" für Einwegklassen zu erzwingen?] (Http://stackoverflow.com/questions/2675504/is-it-possible-to-force-the-use-of-use-of- Verwendung für Einweg-Klassen) Da Sie Ihre Drittanbieter-Bibliothek nicht ändern können. Es enthält auch einige Verpackungslösungen. – Panda
@stuartd https://msdn.microsoft.com/ru-ru/library/fs2xkftw(v=vs.110).aspx. Nein? – FrozenHeart