In this answer Ich fand,Dispose() zum Bereinigen verwalteter Ressourcen?
Cleanup die nicht verwalteten Ressourcen in der Finalize-Methode und die verwalten diejenigen in der Dispose-Methode, wenn das Entsorgen/finalisieren Muster hat im Code verwendet.
Und später fand ich this nice article über finalisieren und entsorgen und bekam eine klare Vorstellung davon. Der Artikel hat den folgenden Code (Page 3), die Konzepte zu erklären:
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Aber darunter, die gleiche Note (die ich am Anfang dieser Frage enthalten) erscheint.
Das Entsorgen/Finalisierung Muster Microsoft empfiehlt, dass Sie implementieren beide Entsorgen und finalisieren, wenn sie mit nicht verwalteten Ressourcen arbeiten. Die richtige Reihenfolge wäre dann , damit ein Entwickler Dispose aufrufen kann. Die Finalize-Implementierung würde ausführen und die Ressourcen würden immer noch freigegeben, wenn das Objekt Müll gesammelt wird, selbst wenn ein Entwickler die Methode Dispose explizit nicht aufgerufen hat. Francesco Balena schreibt in seinem Blog " Dispose/Finalize Muster sollte nur verwendet werden, wenn Ihr Typ ruft nicht verwalteten Code, der nicht verwalteten Ressourcen (einschließlich nicht verwalteten Speicher) reserviert und gibt ein Handle, das Sie schließlich die Ressource freigeben müssen. Beide entsorgen und finalisieren müssen bis zu ihren Eltern Objekte durch Aufruf der entsprechenden Methoden ihrer Eltern, nachdem sie entsorgt oder ihre eigenen Mitglieder abgeschlossen haben ". Einfach gesagt, bereinigen Sie die nicht verwalteten Ressourcen in der Finalize-Methode und die verwalteten in der Dispose-Methode, wenn das Dispose/Finalize-Muster in Ihrem Code verwendet wurde.
Jetzt bin ich wieder verwirrt. Im gesamten Artikel und im Codebeispiel wird gezeigt, dass nicht verwaltete Ressourcen in Dispose()
freigegeben werden sollten. Aber was ist die Relevanz dieses Kommentars?
Edit:
Wie es wird bestätigt, dass diese Zeile:
Einfach gesagt, Bereinigung der nicht verwalteten Ressourcen in der Finalize-Methode und die verwalteten diejenigen in der Dispose-Methode, wenn das Entsorgen/Finalisierung Muster hat sich in Ihrem Code
fehlerhaft ist, ich this answer bearbeitet verwendet.
Tatsächlich gibt es überhaupt keine Bereinigung verwalteter Ressourcen. Ich sehe seinen Standpunkt in keiner Weise relevant. Der maximale Wert, den Sie zum Bereinigen einer verwalteten Ressource verwenden können, besteht darin, sie NULL zuzuweisen. Das ist völlig unnötig mit solch einem guten GC eingebaut. –
Das ist ein Artikel, der 2006 geschrieben wurde, also würde ich mich eigentlich nicht wirklich darum kümmern. –
Es ist nicht ganz so einfach. Sie sollten auch 'Dispose()' implementieren, wenn Sie einen Verweis auf * any * -Objekt eines Typs erstellt und behalten haben, der 'Dispose()' implementiert und den Sie noch nicht entfernt haben. Einige Typen verwenden keine nicht verwalteten Ressourcen, aber sie haben Dinge wie Abonnements für Ereignisse, die sie in ihren 'Dispose()' - Methoden aushängen müssen. Sie müssen solche Objekte entsorgen, selbst wenn sie keine nicht verwalteten Ressourcen verwenden, sonst können Sie eine Art Speicherleck haben. Dies trifft oft besonders auf UI-Klassen zu, die von 'Control' oder' UserControl' abgeleitet sind. –