Dispose
è per liberare risorse "non gestiti" (ad esempio, prese, handle di file, maniglie bitmap, ecc), e se è stato chiamato fuori un finalizzatore (che è quello che i disposing
significa bandiera, btw), per disponendo altri oggetti idisposabili che ritiene non più utili.
Le risorse "non gestite" non sono gestite dal CLR (da cui il nome), e GC non ha problemi con loro o li libera da solo; in assenza del metodo Dispose
(e del codice che lo sta effettivamente utilizzando!), si affiderà al finalizzatore dell'oggetto per ripulire. Alla fine il finalizzatore verrà eseguito (se l'app è integra e l'oggetto ha un finalizzatore) e se il finalizzatore fa il suo lavoro allora tutto è OK, ma ci vorrà del tempo per farlo - e se nel frattempo finisci le maniglie, vabbè. Peccato per quell'altro thread/processo/qualsiasi cosa ne avesse bisogno.
Se si Dispose
, tuttavia, le risorse vengono rilasciate immediatamente e le cose funzionano meglio tutto intorno.
(A proposito, questo non è limitato a EF, SQL Server o qualsiasi altra tecnologia.Il modello usa e getta si trova in tutto il .net framework ed è considerato una buona pratica utilizzarlo ogni volta che si dispone di un IDisposable non è più in uso.)
Per quanto riguarda il motivo per cui lo IDisposable
è stato implementato fino ad ora sull'albero, piuttosto che implementarlo caso per caso ... non sono sicuro al 100%. Ma immagina che stavi scrivendo un quadro. Considera che se tutto non fosse un IDisposable, dovresti controllare - ogni volta che volevi liberarti di qualcosa! - se l'oggetto è usa e getta, e in tal caso è Dispose
. Se invece si implementa IDisposable "just in case", tuttavia, le cose sono semplificate: si elimina sempre. (Se un oggetto non ha nulla da pulire, semplicemente non sostituisce Dispose
- nel qual caso viene chiamato il suo genitore Dispose
e fa la pulizia, che può essere anche niente ...) Ed è un caso abbastanza comune per i controllori di avere cose da ripulire, che anche se questo non è il vero motivo, ha molto senso farlo comunque.
In genere, se è un 'IDisposable', e stai tenendo a tutto ciò che è un 'IDisposable', fornire un metodo' Dispose'. E usalo. – cHao
Ne ho sentito parlare ... ma esattamente perché? C# non ha un garbage collector che distrugge oggetti non necessari una volta che escono dall'ambito di applicazione? Quindi, perché esiste un metodo .Dispose() esplicito come in Controller per asp.net mvc? E anche su Entity Framework? Cosa fa esattamente? –
possibile duplicato di [C# Finalize/Dispose pattern] (http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern) Si prega di controllare le risposte principali per il tag IDisposable (non c'è nulla di specifico per MVC in utilizzo e implementazione di IDisposable). –