Ich verstehe die Verwirrung. Ich denke, es gibt ein paar einfache Richtlinien folgen:
Wenn Ihre Klasse „besitzt“ einen Verweis auf ein anderes Objekt (dh das Objekt auf das andere Objekt erstellt, oder wurde den Verweis auf dieses Objekt mit dem Verständnis gegeben, dass Ihr Objekt "besitzt" es jetzt), dann sind Sie verantwortlich für alle erforderlichen Bereinigungen (falls vorhanden)
Wenn dieses andere Objekt ein .NET-Objekt ist und die IDisposable-Schnittstelle nicht implementiert, dann wahrscheinlich nicht müssen alles tun. Die IDisposable-Schnittstelle ist per Konvention die Schnittstelle, mit der wir deklarieren, ob unsere Objekte aufgeräumt werden müssen.
Wenn dieses andere Objekt ein .NET-Objekt ist und die IDisposable-Schnittstelle implementiert, sollte Ihre Klasse auch die IDisposable-Schnittstelle implementieren. Rufen Sie in Ihrer Dispose-Methode einfach die Dispose-Methode des anderen Objekts auf.
Wenn dieses andere Objekt ein nicht verwaltetes Objekt oder eine nicht verwaltete Ressource ist, sollte Ihre Klasse einen Finalizer implementieren, um sicherzustellen, dass das nicht verwaltete Objekt/die Ressource bereinigt wird. Befolgen Sie die in diesem Blogpost beschriebenen Richtlinien, um das zu implementieren.
Im Folgenden finden Sie einige spezifische Antworten auf Ihre Fragen.
- An einem gewissen Punkt wird Einwickeln .NET nur Win32 nennt, nicht wahr? Sind also die meisten .NET-Objekte in gewisser Weise eine nicht verwaltete Ressource?
Auch wenn ein .NET-Objekt kann einpacken Win32 nennt, der Begriff „Unmanaged Resource“ nicht geeignet ist, weil es ein .NET-Objekt ist, deshalb ist es per Definition ein „Managed Resource“. Die CLR verarbeitet die Speicherzuweisung und die Speicherbereinigung für diese Objekte.
- Was COM-Objekte, die wir .NET-Wrapper haben für - was sie in Betracht gezogen?
.NET Wrapper-Objekte sind immer noch .NET-Objekte, so dass sie „verwalteten Ressourcen“ sind, aber beachten Sie, dass sie ihre eigenen dispose implementieren müssen/finalisieren Logik. Im Grunde kümmern sie sich darum, die "nicht verwalteten Ressourcen" zu bereinigen, damit Sie nicht müssen. Wenn Sie einen eigenen Wrapper für ein COM-Objekt implementieren, sind Sie für die Implementierung der erforderlichen Dispos/finalize-Logik verantwortlich, um sie zu bereinigen, damit die Benutzer Ihres Wrappers dies nicht tun müssen.
- Was verwaltete Klassen, die Funktionalität ausschließlich aus P/Invokes bekommen?
Eine verwaltete Klasse, die P/Invoke verwendet nicht verwalteten Code aufrufen könnte nicht verwalteten Ressourcen werden Zuteilung, je nachdem, was es fordert.Daher kann es erforderlich sein, dass sie die erforderliche Dispos/finalize-Logik implementiert, um diese nicht verwalteten Ressourcen zu bereinigen.
- Was ist C++/CLI-Klassen, die intern native Bibliotheken verwenden?
Ja, das auch nicht verwalteten Ressourcen werden die Zuweisung aus den nativen Bibliotheken, so ist es auch erforderlich sein, würde für sie die notwendige destructor/Finalizerthread Logik zu implementieren.
- Am C# Ebene, die C++/CLI-Klassen, die jetzt IDisposable implementieren Destruktoren hatten ... was sie in Betracht gezogen?
In C++/CLI können Sie wählen, um eine Klasse zu deklarieren entweder (mit dem Schlüsselwort ref) verwaltete oder nicht verwaltete (ohne das Schlüsselwort ref). Wenn es mit dem Schlüsselwort ref angegeben wird, handelt es sich um eine verwaltete Klasse. Es wird auf dem verwalteten Heap zugeordnet und wird vom Garbage Collector bereinigt, sobald es nicht mehr im Gültigkeitsbereich ist und keine Referenzen mehr vorhanden sind. Wenn die Klasse ohne das Schlüsselwort ref deklariert ist, wird sie nicht verwaltet und muss explizit bereinigt werden. In beiden Fällen hat die Klasse möglicherweise nicht verwaltete Ressourcen zugewiesen, die im Destruktor/Finalizer bereinigt werden müssen.
* "Wenn es eine neuere Methode gibt, dieses Problem anzugehen ..." * Was genau ist das Problem hier? –
Verwalten des Lebenszyklus von nicht verwalteten und verwalteten Objekten. Wenn Sie dies in der falschen Reihenfolge tun, können Sie Deadlocks haben – jglouie
Was ist falsch mit dem Beispiel in [der Dokumentation] (http://msdn.microsoft.com/library/System.IDisposable.aspx)? –