Domanda

GC è per gli oggetti gestiti e Finalize è per gli oggetti non gestiti questo è quello che ho letto. Dispose è implicita e Finalize è esplicito è quello che ho letto. Qualcuno può darmi un esempio di un modulo in cui tutti e tre cosa sono stati utilizzati per motivi diversi?

È stato utile?

Soluzione

GC è garbage collection. È la gestione automatica della memoria, che gestisce la pulitura di oggetti allocati sulla memoria dinamica. Il .NET GC impiega un algoritmo di Marco e sweep. Quando si verifica una garbage collection ritiene praticamente tutto oggetto nella parte del mucchio da pulire ripetibili. Poi si passa attraverso un processo di stampa nella quale si esegue la scansione per le radici. Cioè identifica oggetti che sono ancora in uso dall'applicazione. Dopo aver fatto che gli oggetti rimanenti sono ammissibili per la pulizia. Il mucchio può essere compattata come parte della pulitura.

a smaltimento e metodi Finalizer entrambi offrono un'opzione per la pulizia delle risorse, che sono non gestita dal GC. Per esempio. questo potrebbe essere maniglie nativi e simili. Non hanno nulla a che fare con recupero della memoria sul mucchio gestito.

smaltimento deve essere chiamato in modo esplicito su un tipo che implementano IDisposable. Può essere chiamato attraverso il metodo Dispose() stesso o tramite il costrutto using. Il GC non chiamare Dispose automaticamente.

Un finalizzatore o distruttore (come la specifica del linguaggio chiama) d'altra parte saranno automaticamente chiamati qualche tempo dopo che l'oggetto era ammissibile per la pulizia. Finalizzare metodi vengono eseguiti in sequenza su un filo dedicato.

Dispose() permette pulitura deterministica delle risorse, mentre un finalizzatore può fungere da rete di sicurezza nel caso in cui l'utente non chiama Dispose().

Se un tipo implementa un finalizzatore, pulizia delle istanze è in ritardo come il finalizzatore deve essere chiamato prima della pulizia. Cioè sarà necessario un ulteriore raccogliere per recuperare la memoria per le istanze del tipo. Se il tipo implementa IDisposable pure, il metodo Dispose può essere chiamato e quindi l'istanza può sottrarsi finalizzazione. Questo permetterà l'oggetto da pulire come se non avesse un finalizzatore.

Se si vuole scavare in questo, vi consiglio di CLR via C # di Jeffrey Richter . Si tratta di un grande libro e copre tutti i dettagli scabrosi di questo (ho lasciato un certo numero di dettagli). Il nuovo 3 ° edizione è stato appena pubblicato.

Altri suggerimenti

Uno dei vantaggi di .NET è il garbage collector. In molte lingue, ogni pezzo di memoria deve essere gestita dal Developer- qualsiasi memoria allocata alla fine dovrebbe essere rilasciato. In .NET (C #), il Garbage Collector (GC) si occuperà del processo di liberare memoria per voi. Tiene traccia l'utilizzo degli oggetti, e dopo diventano "senza radici". (Vale a dire: non ci sono riferimenti all'interno della vostra applicazione a tale oggetto, direttamente o indirettamente), la memoria dell'oggetto viene pulito automaticamente

Smaltire, o più in particolare, IDisposable e il pattern Dispose, viene utilizzato per gestire le risorse separatamente dal GC. Alcune risorse devono essere ripulito esplicitamente , per vari motivi. Ciò include l'utilizzo di un API "nativo" (dove .NET non conoscono la memoria allocata), utilizzando una risorsa che avvolge maniglie nativi, ecc Al fine di gestire questa situazione in modo pulito, si implementa IDisposable e il pattern Dispose.

Completamento verifica su oggetti quando stanno per essere raccolti dal garbage collector. Questo fornisce una "rete di sicurezza", dove per un oggetto che avrebbe dovuto essere smaltiti possono ancora essere ripulito, se un po 'più tardi ideale. Con l'implementazione di un finalizzatore, è possibile garantire le risorse non gestite sono sempre rilasciati.

Il problema con la maggior parte dei campioni è che ci sono più motivi per utilizzare IDisposable, e la corretta attuazione varia a seconda del motivo lo si utilizza. Ad esempio, se si avvolge direttamente una risorsa nativa, è necessario implementare un finalizzatore, ma se si incapsulare un altro tipo IDisposable, un finalizzatore non è necessario, anche se si deve ancora implementare IDisposable. Per far fronte a questo, ho scritto su IDisposable e finalizzazione in modo approfondito sul mio blog , che descrive la molteplici ragioni si userebbero IDisposable, e diversi modelli per diversi motivi.

Si può fare, a leggere quello che io considero l'articolo definitivo su IDisposable, finalizzatori e spazzatura raccolta, Shawn Farkas' CLR Inside out:. Scavando nel IDisposable

In questo articolo lascia pochi dubbi circa l'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top