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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top