Wie implementieren Sie IDisposable korrekt
Ich habe gesehen, so viel C# - code in meiner Zeit als Entwickler, die versuchen, zu helfen, die GC zusammen durch setzen von Variablen auf null oder den Aufruf von Dispose() auf Klassen (DataSet zum Beispiel) in Ihren eigenen Klassen, die Dispose () - Methode, die
Ich hab mich schon gewundert, wenn es gibt keine Notwendigkeit, Sie zu implementieren, in einer verwalteten Umgebung.
Ist dieser code für eine Verschwendung an Zeit in Ihrem design-Muster?
class MyClass : IDisposable
{
#region IDisposable Members
public void Dispose()
{
otherVariable = null;
if (dataSet != null)
{
dataSet.Dispose();
}
}
#endregion
}
InformationsquelleAutor | 2010-04-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
GC nicht nennen
.Dispose()
(tut Es, jedoch, rufen Sie die finalize -~MyClass()
- Methode, können Sie ein Aufruf an dieDispose()
Methode, um Ressourcen automatisch verwaltet, wenn der GC entscheidet zum Aufräumen der Klasse).Muss immer ein Weg zu "entsorgen", interne Ressourcen wie
DataSets
code verwendet Ihre Klassen (und stellen Sie sicher, die Sie tatsächlich anrufen.Dispose()
oder wickeln Sie den Konstruktor in einenusing
). MitIDisposable
auf Ihre Klassen, die Nutzung interner Ressourcen wird dringend empfohlen.Vom MSDN:
InformationsquelleAutor Codesleuth
Nein, Dispose-Methoden sind nicht eine Verschwendung von Zeit.
Das dispose-Muster ist es zu ermöglichen, einen Anrufer zu bereinigen, eine Klasse, sobald Sie mit Ihr fertig sind, anstatt zu warten, für die Gesamtwertung zu sammeln. Die Verzögerung spielt keine Rolle, viel für nur heap-Speicher, weshalb grundlegende Klassen wie
String
nicht implementieren. Was zu Entsorgen ist nützlich, jedoch ist die Reinigung unmanaged Ressourcen. Irgendwo intern die Dataset-Klasse ist mit eine nicht verwaltete Ressource, so dass es bietet eine dispose-Methode auf, damit Sie um ihn wissen zu lassen, wenn nicht verwaltete Ressourcen freigegeben werden können.Wenn das Muster gefolgt wurde, richtig Dataset wird auch ein finalizer (oder eine Unterklasse wird), was bedeutet, dass, wenn Sie nicht entsorgen Sie es manuell, schließlich die GC laufen würde, der finalizer würde aufgerufen werden, und die nicht verwaltete Ressource würde aufgeräumt werden, dass Art und Weise. Dieser nicht verwaltete Ressource wichtig sein könnte, obwohl, Stell dir vor, es war eine lock-Datei, oder eine Datenbank-Verbindung, die Sie nicht wirklich wollen, hängen herum und warten auf die GC zu laufen, bevor Sie Sie wiederverwenden können Ihre Datenbank-Verbindung. Entsorgen, stellt einen deterministischen Weg von Aufräumen von Ressourcen, wenn Sie fertig sind, anstatt sich auf die nicht-deterministische GC.
Als für die Einstellung der Variablen auf null in einer dispose-Methode. Fast alle Fälle, es wäre sinnlos. Einstellung einer Variablen auf null löscht eine Referenz auf die variable, die machen es für die garbage collection freigegeben (wenn die Letzte Referenz), aber als Sie die Entsorgung von der Klasse sowieso, Sie sind wahrscheinlich zu sein out-of-scope für die enthaltende Klasse, so die interne Klasse, erhalten die Berechtigung für die Sammlung sowieso.
Wenn Sie member-Variablen innerhalb der Klasse, die sind Einweg, die Sie erstellt haben (und nicht nur Referenzen, die Sie halten), dann sollten Sie immer rufen Sie dispose auf, Sie von Ihrer eigenen Klasse die dispose-Methode, aber nicht die Mühe, stellt Sie auf null.
InformationsquelleAutor Simon P Stevens
Nicht ganz. Wenn Sie member-Variablen, das sind Einweg -, dann sollten Sie wahrscheinlich entsorgen Sie es so. Ihr Objekt kann länger Leben als der Umfang der Arbeit, die es macht, wie der garbage collector ist nicht gewährleistet, führen Sie zu einer bestimmten Zeit.
Einstellung verwalteten Variablen auf null, ist eine Verschwendung von Zeit aber. Das Objekt nicht bekommen, GC würd schneller.
InformationsquelleAutor Jamie Penney
Garbage truck kommt zu meinem Bereich jede Woche, aber eben nicht meinen Müll, wenn ich meine Mülltonne in einer Weise, die es sammeln kann.
Sollten Sie entfernen Sie einfach alle unerwünschten Ereignis-Abonnements -, Referenz-und löschen nicht verwalteter Handler auf. Dann Garbage Collector kümmert sich um den rest.
Beispiel unten zeigen die allgemein beste Praxis zu implementieren IDisposable-Schnittstelle. Referenz : https://msdn.microsoft.com/en-us/library/system.idisposable.dispose(v=vs. 110).aspx
IDisposable
ist nicht zu zerstören, Ressourcen-es ist zu release. Wenn einFileStream
eine Datei öffnet, es fordert, dass die OS verhindern, dass jemand anderes aus der Verwendung der Datei, bis auf weiteres; der AufrufDispose
auf dieFileStream
nicht zerstören die Datei-im Gegenteil, es macht es verwendbar, die durch andere Einrichtungen. Der GC arbeitet nach dem Prinzip, dass es keine Eile, Dinge zu zerstören, wenn es gibt Raum, um Sie zu halten, aber sobald der code hat keine Verwendung mehr für einFileStream
es sollte versucht werden, die Datei wieder auf andere code so bald wie möglich.Nicht ganz sicher, was Sie zu sagen versuchen. Ich denke, FileStream Entsorgen hat lassen Sie die Datei-handler, und lassen Sie den garbage collector zum löschen verwalteten Instanzen. Es ist alleiniger Zweck, wenn Sie nicht nutzbar zu machen für andere.Wenn Sie nicht die Datei exklusiv öffnen, es kann in der Lage sein zu verwenden, von anderen sowieso.
Der Grund, den GC allein ist nicht ausreichend für Dinge wie
FileStream
ist nicht, dass Sie immer hält eine lock-Datei in einer Weise, die stört, mit anderen Entitäten, die Notwendigkeit, die Datei zu verwenden, aber, dass Sie manchmal, und es ist in der Regel einfacher, Ressourcen freizugeben, wenn Sie nicht mehr benötigt werden, ohne Rücksicht darauf, ob die Behauptung würden tatsächlich existieren, als um die Fälle zu identifizieren, wo Konflikte nicht existieren und aufzugeben Ressourcen, ohne dass Ihnen in solchen Fällen. Beachten Sie, dass die manchmal haben Sie nicht zu sehr "oft" zu machenIDisposable
lohnt sich. Auch wenn der Verzicht einen Datei-stream......arbeiten würde, 99% der Zeit, kann es einfacher sein, um code nennen
Dispose
auf Datei-streams 100% der Zeit, wenn Sie nicht mehr benötigt werden, als Codes, die in der Regel nicht, entsorgen Sie die Arbeit 100% der Zeit.InformationsquelleAutor CharithJ