, Entsorgen Methoden sind keine Zeitverschwendung.
Mit dem Dispo-Muster kann ein Anrufer eine Klasse bereinigen, sobald sie damit fertig ist, anstatt darauf zu warten, dass der GC sie erfasst. Die Verzögerung spielt für den einfachen Heapspeicher keine Rolle, weshalb Basisklassen wie String
diese nicht implementieren. Was Dispose aber nützlich ist, ist die Reinigung von unmanaged Ressourcen. An anderer Stelle verwendet die Dataset-Klasse eine nicht verwaltete Ressource. Daher stellt sie eine Methode zur Verfügung, mit der Sie wissen lassen können, wann diese nicht verwaltete Ressource freigegeben werden kann.
Wenn das Muster korrekt befolgt wurde, hat Dataset auch einen Finalizer (oder eine Unterklasse), was bedeutet, dass der Finalizer aufgerufen und nicht verwaltet wird, wenn Sie ihn nicht manuell löschen Ressource würde auf diese Weise aufgeräumt werden. Diese nicht verwaltete Ressource könnte jedoch wichtig sein. Stellen Sie sich vor, wenn es sich um eine Dateisperre oder eine Datenbankverbindung handelt, möchten Sie nicht warten, bis der GC ausgeführt wird, bevor Sie Ihre Datenbankverbindung erneut verwenden können.Dispose bietet eine deterministische Möglichkeit, Ressourcen zu bereinigen, wenn sie fertig sind, anstatt sich auf den nicht-deterministischen GC zu verlassen.
Zum Festlegen von Variablen auf Null in einer Dispose-Methode. In fast allen Fällen wäre es sinnlos. Wenn Sie eine Variable auf null setzen, wird ein Verweis auf diese Variable entfernt, wodurch sie für die Garbage Collection geeignet wird (wenn dies die letzte Referenz ist). Da Sie die Klasse jedoch dennoch verwerfen, werden Sie wahrscheinlich den Bereich für das Containing verlassen Klasse, so dass die interne Klasse trotzdem für die Sammlung in Frage kommt. Wenn Sie Membervariablen in Ihrer Klasse haben, die von Ihnen erstellt wurden (nicht nur Verweise, die Sie behalten), sollten Sie sie immer über die Dispose-Methode Ihrer eigenen Klasse aufrufen, aber setzen Sie sie nicht auf null .
Der Zweck von 'IDisposable' ist nicht Ressourcen zu zerstören - es ist * sie zu * freigeben *. Wenn ein 'FileStream' eine Datei öffnet, fordert er an, dass das Betriebssystem bis auf weiteres verhindert, dass jemand anderes die Datei verwendet; Das Aufrufen von 'Dispose' auf dem' FileStream' zerstört die Datei nicht - im Gegenteil, sie macht sie für andere Entitäten * nutzbar. Der GC arbeitet nach dem Prinzip, dass es keine Eile geben sollte, Dinge zu zerstören, wenn Platz vorhanden ist, aber sobald Code für einen 'FileStream' keinen Nutzen mehr hat, sollte er versuchen, die Datei wieder für anderen Code verfügbar zu machen möglich. – supercat
@supercat: Nicht ganz sicher, was Sie sagen wollen. Ich denke, FileStream Dispose gibt den Dateihandler frei und lässt den Garbage Collector verwaltete Instanzen löschen. Es ist der einzige Zweck, wenn es nicht für andere nutzbar gemacht wird. Wenn Sie die Datei nicht ausschließlich öffnen, kann sie möglicherweise von anderen verwendet werden. – CharithJ
Der Grund, warum GC alleine nicht ausreicht, ist, dass 'FileStream' nicht immer eine Dateisperre in einer Weise enthält, die andere Entitäten stört, die die Datei benutzen müssen, aber * manchmal *, und es ist im Allgemeinen einfacher, Ressourcen freizugeben, wenn sie nicht mehr benötigt werden, ohne Rücksicht darauf, ob Konflikte tatsächlich existieren, als Fälle zu identifizieren, in denen Konflikte nicht existieren, und Ressourcen aufzugeben, ohne sie in solchen Fällen freizugeben. Beachten Sie, dass das * manchmal * nicht sehr "oft" sein muss, damit "IDisposable" sich lohnt. Selbst wenn man einen Datei-Stream verlässt ... – supercat