Wird Deponieren Sie für anonyme Variablen genannt werden?
-
03-07-2019 - |
Frage
Beispiel:
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
Es gibt keine Verwendung von Block, keine offensichtliche Art und Weise unter Verwendung einen Block, keine offensichtliche Möglichkeit zu nutzen, um zu rufen Dispose (). Und natürlich UnmanagedResourceUsingMemorySuckingPig nicht implementiert IDisposable.
Lösung
Wenn die Finalizerthread dieser Klasse Dispose()
nennen, ja. Wenn nicht, nein.
(edit) Nur einige weitere Informationen :
Gehen Sie nicht davon, dass Entsorgen wird namens. Nicht verwalteten Ressourcen durch eine im Besitz Auch sollte in einem freigegeben werden Finalisieren Verfahren im Fall, dass Dispose nicht aufgerufen wird.
Bearbeiten
die oben bearbeiten Um zu klären, ich habe viele Leute gesehen (in diesem Thread, auf SO und anderswo) behauptet, dass „Die GC Dispose()
nennen wird, wenn das Objekt entfernt wird.“ Dies ist nicht der Fall. Ja, ein gutes, defensives Coder eine Komponente schreiben wird, dass Dispose()
annehmen wird nicht explizit genannt werden, und zwar in der Finalizerthread. Allerdings ist ein guter defensiven Coder eine Komponente muss davon ausgehen, dass die Finalizerthread NICHT Dispose()
nicht nennen. Es gibt keinen automatischen Aufruf von Dispose()
in der Garbage Collector . Diese Funktion ist nur dann gegeben, wenn der Finalizer Dispose()
nennt.
Andere Tipps
Ich glaube nicht. Sie werden schreiben:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
Sie können nur sicher sein, dass, wenn es einen Finalizer (destructor) hat, dann wird das genannt werden.
Ein Finalizerthread kann Dispose()
nennen, aber die übliche Implementierung ist, dass sowohl die Finalizerthread und Dispose()
Aufruf protected Dispose(bool)
.
Mit anderen Worten, es hängt von der Umsetzung der UnmanagedResourceUsingMemorySuckingPig
, wenn sie die Richtlinien folgen dann das anonyme Objekt wird gereinigt werden, aber nicht so effizient wie mit einem using
Block.
Nein. Allerdings sammeln die GC wird schließlich das Objekt und feststellen, dass es finalizable ist (es ist finalizable, nicht wahr?) Und wird es für Sie übernehmen. Entsorgen Sie ist für Ressourcen deterministisch aufzuräumen.