2012-03-12 7 views
8

Sono consapevole che tutti gli oggetti che implementano IDisposable devono essere eliminati non appena non sono più necessari per liberare la memoria utilizzata dalle loro risorse non gestite.Devo preoccuparmi di chiamare disporre oggetti che condividono la durata del processo?

La mia domanda riguarda oggetti che conosco per un fatto finché il processo host non verrà terminato. Farebbe qualche differenza se li caccio o no? C'è qualche possibilità che la memoria non venga liberata quando il processo muore? Che dire degli oggetti GDI? Le maniglie GDI sarebbero liberate quando il processo muore anche se non sono state eliminate?

Capisco perfettamente che è buona norma disporre di tutti gli oggetti comunque. Lo chiedo solo per curiosità.

+0

http://blogs.msdn.com/b/kimhamil/archive/2008/11/05/when-to-call-dispose.aspx Wow, la gente mi ha saltato addosso come un branco di cani su un gatto a 3 zampe per aver detto di non disporre. Ho trovato che fa più male che aiuta. Non dovrebbe essere gestito da un contenitore il ciclo di vita, non il codice hard ??? – CrazyDart

+0

@CrazyDart Grazie, è una lettura di iteresting, sebbene si occupi principalmente della domanda "Dovrebbe essere disposto l'oggetto di tipo X normalmente". La domanda più specifica a cui sto cercando di rispondere è "l'oggetto di tipo X, che dovrebbe essere definitivamente ** disposto normalmente, essere disposto anche se condivide la durata del processo?" – Rotem

+1

@CrazyDart Quando Dispose ti ha ferito? Il link che fornisci fornisce alcuni esempi di quando Dispose non deve essere chiamato, ma la regola generale dovrebbe essere comunque chiamarla a meno che tu non abbia una buona ragione per non farlo. – hvd

risposta

7

Dipende dall'oggetto (risorsa) in questione.

Quando un processo termina tutta la memoria non gestita, i filehandle e altre risorse del sistema operativo verranno rilasciati, anche se i finalizzatori associati non sono stati eseguiti.

Ma io non sono così sicuro di maniglie db,-mutex di nome ecc

Quindi, prima si potrebbe considerare sicuro di non chiamare Dispose, si dovrebbe conoscere il tipo di risorsa e come si riferisce al processo. Molto più semplice chiamare Dispose() fuori dal principio generale.

Ma è un argomento teorico, la maggior parte delle classi utilizzerà SafeHandle : CriticalFinalizerObject. Quindi non penso che sia mai un vero problema pratico.

+0

Per impostazione predefinita, a ogni oggetto che ha un finalizzatore verrà eseguito il finalizzatore. È il contrario che puoi controllare dal tuo codice: il tuo 'Dispose' può chiamare' GC.SuppressFinalize' per segnalare che il finalizzatore non è più necessario. (Modifica: In realtà, penso che ogni oggetto abbia un finalizzatore, ma per impostazione predefinita non fa nulla.) – hvd

+1

@hvd - in teoria, un normale finalizzatore potrebbe essere saltato dal GC. –

+0

@hvd - "Penso che ogni oggetto abbia un finalizzatore" corretto, "ma per impostazione predefinita non fa nulla". Anche corretto, e molto fortunato. I finalizzatori reali sono costosi. –

2

No. Per design, IDisposable è disponibile per consentire a un programma di rilasciare una risorsa non gestita in anticipo, prima di quanto potrebbe fare il finalizzatore. Che viene eseguito in un momento abbastanza imprevedibile, in genere successivo a ogni volta che viene eseguita una raccolta dati obsoleti. Non puoi predire quando ciò accade.

Non c'è alcun senso nell'eliminare all'uscita del programma, il finalizzatore è garantito per essere eseguito appena prima che AppDomain venga scaricato e il processo venga arrestato.

Si dice che vi sia un abuso di IDisposable, codice che in realtà si aspetta che lo si chiami. Ma di solito si basa sullo usando la dichiarazione, quindi non è così probabile che ci si imbatta in quello.

+1

I finalizzatori non sono garantiti per l'esecuzione all'uscita del programma. Il sistema è garantito per fare qualche sforzo per eseguirli, ma ciò non significa che verranno effettivamente eseguiti. I finalizzatori sono davvero icky e la maggior parte degli oggetti non dovrebbe davvero averli. – supercat