Entsorgung ein IDisposable-Objekt in ein öffentliches statisches Feld
Wenn eine Klasse hat eine Instanz-Feld, das IDisposable implementiert dann die enthaltende Klasse IDisposable implementiert und Klasse, dass Felder, die Dispose-Methode in Ihrer Dispose-Methode.
public class A : IDisposable
{
public System.Drawing.Font font = new Font("Arial", 10.0f);
public void Dispose()
{
font.Dispose()
}
}
(Ich weiß, ich habe nicht das dispose-Muster richtig, aber für den Beispiel-code sollte gut genug sein)
Wenn das Feld ein statisches Feld, obwohl, wo sollte der Aufruf auf das Feld Entsorgen werden?
public class B
{
public static System.Drawing.Font font = new Font("Arial", 10.0f);
}
Konnte ich machen, Klasse B implementieren Sie IDisposable und haben, dass call font.Dispose
aber wenn B. schriftart verwendet wird, später erneut auf, das würde zu Problemen führen. So gut wie Sie hätte sich zu erinnern, dass dispise den Zugriff auf eine statische Methode, die Sie brauchen zu erstellen eine Instanz nur zu nennen Entsorgen.
Konnte ich auch eine statische Methode Dispose dann aber die Nutzer haben sich daran zu erinnern zu nennen, Veräußern und sicherzustellen, dass Sie der Letzte Nutzer es in dem Programm.
- Es gibt keine solche Sache wie ein "statisches Objekt", also ist die Frage sinnlos.
- Ihre Frage ist allgemein. versuchen Sie, bestimmte er.
- Woops, tippte es. Danke für den catch
- In einigen Fällen müssen Sie überschreiben.
- Es ist nicht klar, was Sie nun Fragen. Haben Sie versucht, das offensichtliche Ansatz
A.font.Dispose()
? Wenn nicht, warum nicht? - Gehen für eine komplette Neuentwicklung der Frage, denke ich. Bei Gehirn-Fragen schneller als ich denken kann, wie zu Fragen,
- Dies scheint nicht wie eine gute Idee, von Anfang an. Was passiert, wenn Sie sich entscheiden, verwenden Sie die Referenz nach, die Sie angerufen haben
Dispose
(aber vergessen zu initialisieren)? Ich hoffe, Sie sind nicht reichte dieser code heraus für andere zu verwenden. - Das ist so etwas wie der Stamm der Frage, denke ich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statischen Felder initialisiert werden, wenn der Typ geladen ist.
Daher ist es logisch, es macht Sinn zu entsorgen Objekt zugewiesen werden, um das statische Feld, wenn die Sie enthaltende Typ entladen wird.
Jedoch nicht entladen. Es kann einige exotische Komplikation hier um AppDomains, aber ich vermute, dass nicht in Ihrem Fall anwendbar.
Daher würde ich nicht entsorgen, die Instanz, sonst haben Sie einen öffentlich zugänglichen Instanz eines Objekts, das unbrauchbar ist.
readonly
, wenn es zugewiesen wird, ist es wahrscheinlich eine gute Idee, um die Entsorgung der alten Instanz, wie ich schrieb in meiner Antwort.Wenn das Feld statisch ist, dann vielleicht die Absicht zu haben es zuletzt für die gesamte Dauer der Anwendung? Weil dann wird es nur entsorgt werden müssten, wenn die Anwendung heruntergefahren. Und das wird passieren, die eine oder andere Weise, indem Sie sich-
Wenn Sie planen, weisen Sie die statische Feld, um verschiedene
IDisposable
Objekte, die mehrmals während der Lebensdauer der Anwendung, dann natürlich, Sie würden wollen, entsorgen Sie das alte Objekt an, wenn Sie neu zuweisen. Vielleicht könnten Sie eine Eigenschaft? Nicht, dass ich darüber viel nachgedacht, sondern so etwas wie:Du entsorgen Sie es wie jedes andere Objekt. Es nicht einen Unterschied machen. Ein statisches Objekt ist nur ein Objekt pro Klasse. Es ist immer noch eine Instanz von etwas. Zugegeben, Sie wahrscheinlich würde nicht wollen, dies zu tun, da Sie nach der Entsorgung kann sich jemand noch darauf zugreifen und erhalten Sie einen
ObjectDisposedException
Ausnahme.Und die Ausgabe ist:
Pro aktualisiert Ihre Beispiel:
Können Sie nur
A.font.Dispose()
oderusing(A.font)
Im Allgemeinen ich denke, die Idee ist, dass man wirklich nicht mehr über eine öffentliche statische Einweg-Feld, da macht es statische Sie implizieren sollte es sein, um für die gesamte Lebensdauer der Anwendung. Wenn schon Einweg, sollten Sie machen könnte es auch faul und machen es thread-sicher re-initializable, sonst wird der Zugriff nach der Entsorgung werfen Ausnahmen. Oder Sie haben einen Haken in Ihren Programm-end-code und sicher entsorgen Sie alle statische Einweg-Kameras gibt. Sie können sich registrieren, Ihre Einweg-auf der Startseite irgendwo als gut. Nur eine Idee
Instance
Feld nur einmal gelesen? Denn nachusing (Test.Instance) { ... }
dem Objekt angeordnet ist (und daher vermutlich nicht mehr verwendbar sind), also, wenn jemand sagtTest.Instance
eine zweite Zeit bekommen Sie einen "broken" - Objekt, das bereits veräußert worden.Kann man nicht entsorgen, eine statische Klasse, denn es gibt keine Instanz,
A.Dispose()
, weil es einfach nicht getan.IDisposable
gemeint ist, ist für die Entsorgung Instanzen, nicht ganzen Klassen. Zwar konnte man eine statischeDispose
verfügt, dass jedes statische Element, (2) die Semantik vonDispose
sind so, dass alles, was SieDispose
ist jetzt eine nutzlose Hülle, und sollte nicht verwendet werden, für nichts anderes. Die Entsorgung einer ganzen Klasse? Ehhh....