2012-02-26 11 views
8

Voglio sapere c'è qualche differenza tra distruttore e garbage collector, il distruttore è usato per smaltire tutti gli oggetti non utilizzati alla fine della vita dell'applicazione, lo stesso è l'uso del garbage collector , Garbage Collector può essere chiamato manualmente o fatto alla fine dell'applicazione, lo stesso con il distruttore, entrambi sono opzionali e usano per smaltire l'oggetto senza riferimento, qualcuno può indicarmi la differenza esattadifferenza tra distruttore e garbage collector

+1

. Netto (come la maggior parte dei linguaggi di raccolta dei rifiuti) non ha distruttori. In C++/CLI sono falsificati usando i finalizzatori. –

+1

@Billy la specifica del linguaggio C# ha utilizzato entrambi i termini "finalizzatore" e "distruttore" che si riferiscono alla stessa cosa. –

+0

@MarcGravell: È strano; hanno davvero semantica completamente diversa. Un concetto è eseguito deterministicamente; l'altro no. Tuttavia, penso di più al livello CLR rispetto al livello C#; dopo tutto la domanda dice .Net piuttosto che C#, e per quanto riguarda il CLR non esistono distruttori. –

risposta

6

Il distruttore è uno speciale funzione membro invocata quando un oggetto viene distrutto. È l'ultimo metodo eseguito da una classe.

Il garbage collector fa parte del framework, gestisce automaticamente la memoria e raccoglie non deterministicamente oggetti senza riferimento per evitare perdite di memoria.

+0

Il metodo 'Finalize' generato dal distruttore viene richiamato quando il GC scopre un oggetto che, ma per il fatto che l'oggetto è stato registrato per la finalizzazione, non esisterebbe più. Spesso è l'ultimo metodo eseguito su un oggetto di classe, ma è possibile che un riferimento forte con radice all'oggetto possa essere creato e memorizzato da qualche parte in qualsiasi momento prima che il finalizzatore venga completato (e forse anche prima che inizi!) Nel qual caso l'oggetto potrebbe continuare ad esistere indefinitamente. – supercat

3

Il garbage collector è una parte dell'ambiente .NET che tiene traccia degli oggetti e si assicura che gli oggetti vengano rimossi dalla memoria quando non sono più necessari.

Un distruttore è una parte di un progetto di classe. È l'opposto di un costruttore. Quando lo dichiari, il GC lo chiamerà quando distruggerà un oggetto.

Here is the MSDN documentation.

6

Il garbage collector e finalizzatore/distruttore sono intrinsecamente legate - tuttavia, la maggior parte degli oggetti non hanno bisogno (e non hanno) un distruttore. In realtà sono molto rari nel codice gestito e vengono solitamente utilizzati per garantire che le risorse non gestite vengano rilasciate. Se un oggetto ha un distruttore/finalizzatore, il garbage collector lo richiama nello stesso momento della raccolta (forse nel passaggio successivo). La raccolta dei rifiuti non è deterministica: accade quando accade, spesso in relazione alla pressione della memoria.

Molto più comune, tuttavia, è IDisposable. Ciò consente un modello più prevedibile per il rilascio di risorse ora (anziché quando il GC si verifica in seguito). Spesso, le classi che hanno un finalizzatore saranno anche essere IDisposable, con l'implementazione Dispose() disabilitando il distruttore (non è necessario se abbiamo già ripulito). Si noti che Dispose() non è correlato alla garbage collection, ma supporta la lingua tramite l'istruzione "using".

IDisposable è molto più comune di finalizzatori rispetto a. Sei responsabile di garantire che qualsiasi cosa IDisposable venga smaltita. Nota aggiuntiva: lo smaltimento di qualcosa non causa la raccolta dell'oggetto; questo viene fatto solo dal GC su qualsiasi programma scelto dal GC. Lo smaltimento, piuttosto, rilascia le risorse associate. Ad esempio, non vorrai che un file sia bloccato finché non si verifica GC; il Dispose() qui sblocca il file (rilasciando l'handle del file OS).

+0

Ok, fammi controllare se ho ottenuto il concetto, GC è usato per controllare se è necessario disporre dell'oggetto, e se qualcuno chiamerà il distruttore, GC non può distruggere nulla da solo, e il Desctructor d'altra parte , distruggerà l'oggetto alla fine della classe e il distruttore non può controllare i problemi di memoria, ma distrugge tutto alla fine. ho ragione? – Abbas

+0

@Abbas multipli "non proprio" ho paura. In primo luogo, evita il termine "smaltimento": il GC non "mai" in termini di "IDisposable", quindi vale la pena di stare lontano da quella parola. Adesso; il GC è responsabile del recupero della memoria sull'heap gestito utilizzato da ciascun oggetto, una volta che ciascun oggetto non è più raggiungibile. Molto può distruggere qualsiasi cosa. Tuttavia, ** se ** c'è un distruttore/finalizzatore (e tale non è stato esplicitamente disabilitato per quell'oggetto), allora il GC invocherà il distruttore/finalizzatore per consentire alla classe di ripulire eventuali risorse non gestite. –

+0

hai detto "Molto può distruggere qualsiasi cosa", e anche il distruttore può distruggere tutto alla fine, in quel caso qual è la differenza tra entrambi, tuttavia MSDN dice "Quando l'oggetto è idoneo per la distruzione, il garbage collector esegue il Finalizza il metodo dell'oggetto. ", Questo significa che GC non può liberare memoria, deve chiamare distruttore per liberare memoria: qui il link http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx. – Abbas

0

Il garbage collector funziona principalmente copiando tutti gli oggetti che può trovare in una nuova parte di RAM e quindi facendo nuotare la vecchia area; non sa né si preoccupa se ci siano stati cinque o 500.000 oggetti lasciati indietro. Si noti che oltre a trovare tutti gli oggetti a cui fanno riferimento riferimenti forti dal vivo, il garbage collector può trovare anche altri oggetti, compresi oggetti che sostituiscono Finalize, oggetti usati come blocchi del monitor, oggetti presi di mira da oggetti WeakReference, ecc. vecchia area dall'orbita, il garbage collector deve occuparsi di uno qualsiasi degli oggetti "speciali" che sa che potrebbe essere ancora lì seduto.

Tra le altre cose, il garbage collector ha un elenco di tutti gli oggetti che hanno registrato un finalizzatore; controllerà tutti gli oggetti su quell'elenco per vedere se sono stati ancora copiati nella nuova area di memoria.Se ne viene trovato uno non lo sono, verranno rimossi dall'elenco di oggetti con un finalizzatore registrato e aggiunti a un elenco di oggetti il ​​cui metodo Finalize deve essere eseguito non appena possibile. Una volta che questo è stato fatto per tutti gli oggetti con un finalizzatore registrato, tutti gli oggetti nell'elenco di oggetti che necessitano di una finalizzazione immediata, così come qualsiasi oggetto a cui tali oggetti contengono un riferimento, saranno copiati nella nuova area.