Dispose verrà chiamato per variabili anonime?
-
03-07-2019 - |
Domanda
Ad esempio,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
Non esiste un blocco utilizzante, non esiste un modo ovvio per utilizzare un blocco utilizzante, non esiste un modo ovvio per chiamare Dispose (). E ovviamente UnmanagedResourceUsingMemorySuckingPig implementa IDisposable.
Soluzione
Se il finalizzatore di quella classe chiama Dispose ()
, sì. In caso contrario, no.
(modifica) Solo alcuni ulteriori informazioni :
Non dare per scontato che sarà Dispose chiamato. Risorse non gestite di proprietà di a il tipo dovrebbe anche essere rilasciato in a Finalizza il metodo nel caso in cui Dispose non viene chiamato.
Modifica
Per chiarire la modifica di cui sopra, ho visto molte persone (in questo thread, su SO e altrove) affermare che " Il GC chiamerà Dispose ()
quando l'oggetto viene rimosso. " ; Non è assolutamente il caso. Sì, un buon programmatore difensivo che scrive un componente suppone che Dispose ()
non verrà chiamato esplicitamente e lo fa nel finalizzatore. Tuttavia, un buon programmatore difensivo USANDO un componente deve presumere che il finalizzatore NON chiami Dispose ()
. Non è presente alcuna chiamata automatica di Dispose ()
nel Garbage Collector . Questa funzionalità è disponibile SOLO se il finalizzatore chiama Dispose ()
.
Altri suggerimenti
Non ci credo. Dovrai scrivere:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
Puoi essere sicuro che se ha un Finalizzatore (distruttore) verrà chiamato.
Un finalizzatore può chiamare Dispose ()
ma l'implementazione usuale è che sia il finalizzatore che Dispose ()
chiamano protetto Dispose (bool)
.
In altre parole, dipende dall'implementazione di UnmanagedResourceUsingMemorySuckingPig
, se segue le linee guida, l'oggetto anonimo verrà ripulito, ma non in modo efficiente come con un che usa
blocco.
No. Tuttavia, il GC alla fine raccoglierà l'oggetto e noterà che è finalizzabile (è finalizzabile, giusto?) E lo finalizzerà per te. Dispose serve per la pulizia deterministica delle risorse.