No, a smaltimento metodi non sono una perdita di tempo.
Il pattern di smaltimento è lì per consentire a un chiamante di ripulire una classe non appena hanno finito con essa, piuttosto che aspettare che il GC la raccolga. Il ritardo non è molto importante per la memoria di heap normale, motivo per cui le classi di base come String
non la implementano. Ciò che è utile per Dispose è la pulizia delle risorse non gestite. Da qualche parte internamente, la classe Dataset utilizza una risorsa non gestita, quindi fornisce un metodo di smaltimento per consentire di sapere quando questa risorsa non gestita può essere rilasciata.
Se il modello è stato seguito correttamente Dataset avrà anche un finalizzatore (o qualche sottoclasse volontà) il che significa che se non smaltire manualmente, alla fine il GC correrebbe, il finalizzatore otterrebbe chiamato e non gestito la risorsa verrebbe pulita in questo modo. Questa risorsa non gestita potrebbe essere importante, immagina se si trattasse di un blocco di file o di una connessione a un database, non si desidera rimanere in attesa che il GC venga eseguito prima di poter riutilizzare la connessione al database.Dispose fornisce un metodo deterministico per ripulire le risorse quando sono terminate anziché affidarsi al GC non deterministico.
Come per impostare le variabili su null in un metodo di dispose. Quasi tutti i casi sarebbe inutile. l'impostazione di una variabile su null rimuove un riferimento a tale variabile, che lo renderà idoneo per la garbage collection (se questo è l'ultimo riferimento), ma poiché si sta eliminando la classe comunque, è probabile che si esca dall'ambito per il contenitore classe, quindi la classe interna diventerà comunque eleggibile per la raccolta.
Se all'interno della classe sono presenti variabili membro monouso create dall'utente (non solo riferimenti in attesa), è necessario chiamare sempre su di esse dal metodo di smaltimento della propria classe, ma non preoccuparsi di impostarle su null .
fonte
2010-04-29 10:29:04
Lo scopo di "IDisposable" non è quello di distruggere le risorse: è quello di * rilasciarle *. Quando un 'FileStream' apre un file, richiede che il sistema operativo impedisca a chiunque altro di utilizzare il file fino a nuovo avviso; chiamare 'Dispose' su' FileStream' non distrugge il file - al contrario, * lo rende utilizzabile da altre entità *. Il GC opera sul principio che non ci dovrebbe essere fretta di distruggere le cose quando c'è spazio per tenerle, ma una volta che il codice non ha più utilità per un 'FileStream', dovrebbe cercare di rendere il file nuovamente disponibile ad altro codice non appena possibile. – supercat
@supercat: Non sei proprio sicuro di cosa stai cercando di dire. Immagino che FileStream Dispose rilasci il gestore di file e permetta al garbage collector di cancellare le istanze gestite. È l'unico scopo se non renderlo utilizzabile per gli altri. Se non apri il file esclusivamente, potrebbe comunque essere possibile utilizzarlo da altri. – CharithJ
Il motivo per cui GC non è sufficiente per cose come 'FileStream' non è che * sempre * detengono un blocco di file in una maniera che interferisce con altre entità che hanno bisogno di usare il file, ma che * qualche volta * fanno, ed è generalmente più facile rilasciare le risorse quando non sono più necessarie, senza riguardo per l'effettiva esistenza della contesa, piuttosto che identificare i casi in cui la contesa non esisterà e abbandonare le risorse senza rilasciarle in questi casi. Nota che * a volte * non deve essere molto "spesso" per rendere utile 'IDisposable'. Anche se l'abbandono di un flusso di file ... – supercat