2016-06-01 23 views
0

Ich habe diese Artikel auf Dispose Pattern und Dispose Implementation gelesen. Meine Frage ist, wenn wir die Methode virtual dispose (bool) vom Finalizer aufrufen, warum wir nur false an die Methode übergeben und die nicht verwaltete Ressource freigeben? Wenn wir wahr werden, was wird es brechen?Entsorgen Muster Verwendung

Auch auch wir die IDisposble Schnittstelle implementiert haben, stützt sie sich nach wie vor auf dem Entwickler entweder den Code in den mit Block wickeln oder Dispose() explizit, damit die Methode Dispose() aufgerufen werden, nennen. Was ist das Addon der IDisposble-Schnittstelle, wenn der Entwickler nicht vorsichtig genug ist?

Antwort

1

Vom ersten Link:

Das Boolesche Parameter Verfügen zeigt an, ob die Methode von der IDisposable.Dispose Implementierung oder von dem Finalizerthread aufgerufen wurde. Die Dispose (bool) Implementierung sollte den Parameter überprüfen, bevor sie auf andere Referenzobjekte zugreift (z. B. das Ressourcenfeld in des vorhergehenden Beispiels). Auf solche Objekte sollte nur zugegriffen werden, wenn die Methode von der IDisposable.Dispose-Implementierung aufgerufen wird (wenn der Disposing-Parameter gleich true ist). Wenn die Methode von dem Finalizer aufgerufen wird (Disposing ist falsch), sollten andere Objekte nicht auf zugegriffen werden. Der Grund ist, dass Objekte in einer unvorhersehbaren Reihenfolge abgeschlossen werden und so, sie oder eine ihrer Abhängigkeiten möglicherweise bereits abgeschlossen haben.

Hoffe, das hilft.

+0

Der zweite Link implementiert jedoch die Freigabe der verwalteten Quelle, wenn die Bedingung wahr ist, einschließlich des Abhängens der Ereignisse. Wenn der Finalizer in diesem Fall die dispose-Methode aufruft und false an sie gibt, wird das Ereignis nicht ausgehakt und führt zu einem Speicherverlust, nicht wahr? – Helic

+0

Das Dispose-Muster ist nur eine Richtlinie. Jemand hat vielleicht einen guten Grund, etwas anderes zu tun, aber ich persönlich würde die MS-Richtlinie zu Dispose befolgen. –