2012-12-21 7 views
47

Sto studiando come funziona il garbage collector in C#. Sono confuso dall'uso dei metodi Destructor, Dispose e Finalize.Differenza tra destructor, dispose e finalize method

Come da mia ricerca e comprensione, avere un metodo Destructor all'interno della mia classe dirà al garbage collector di eseguire la garbage collection nel modo menzionato nel metodo del distruttore che non può essere chiamato esplicitamente sulle istanze della classe.

Il metodo Dispose ha lo scopo di fornire all'utente il controllo della garbage collection. Il metodo Finalize libera le risorse utilizzate dalla classe, ma non l'oggetto stesso.

Non sono sicuro di averlo capito nel modo giusto. Si prega di chiarire i dubbi. Eventuali ulteriori link o guide sono benvenuti.

risposta

45

Il distruttore chiama implicitamente il metodo Finalize, sono tecnicamente uguali. Dispose è disponibile con quegli oggetti che implementano l'interfaccia IDisposable.

Si può vedere: Destructors C# - MSDN

Il distruttore chiama implicitamente Finalizza sulla classe base dell'oggetto .

Esempio dallo stesso link:

class Car 
{ 
    ~Car() // destructor 
    { 
     // cleanup statements... 
    } 
} 

codice Destructor è implicitamente tradotto al seguente codice:

protected override void Finalize() 
{ 
    try 
    { 
     // Cleanup statements... 
    } 
    finally 
    { 
     base.Finalize(); 
    } 
} 

La vostra comprensione per il distruttore è giusto:

Da MSDN

Il programmatore non ha il controllo su quando il distruttore viene chiamato perché questo è determinato dal garbage collector. Il raccoglitore spazzatura verifica la presenza di oggetti che non vengono più utilizzati dall'applicazione . Se considera un oggetto idoneo per la distruzione, lo chiama il distruttore (se presente) e recupera la memoria utilizzata per memorizzare l'oggetto . I distruttori vengono anche chiamati quando il programma termina. È possibile possibile forzare la garbage collection chiamando Collect, ma la maggior parte di l'ora, questo dovrebbe essere evitato perché potrebbe creare problemi di prestazioni .

+0

Come forzare la garbage collection chiamando 'Collect()' può il metodo creare problemi di prestazioni? – Destructor

35

in C# termini, un distruttore e finalizzatore sono fondamentalmente concetti intercambiabili, e dovrebbe essere usato per rilasciare non gestiti risorse quando un tipo viene raccolto, ad esempio maniglie esterne. È molto raro che è necessario scrivere un finalizzatore.

Il problema di questo è che GC è non-deterministico, quindi il metodo Dispose() (via IDisposable) permette di sostenere deterministico pulitura.Questo non è correlato alla garbage collection e consente al chiamante di rilasciare qualsiasi risorsa prima del. E 'adatto anche per l'uso con gestita risorse (oltre a non gestito), ad esempio, se si dispone di un tipo che incapsula (diciamo) una connessione al database, si potrebbe desiderare di smaltire il tipo per rilasciare la connessione troppo.

+0

quindi quello che sento è che il metodo Destructor dovrebbe contenere solo il codice che deve essere eseguito prima della sua distruzione, il metodo Finalize sarà per lo più ereditato dalla super classe. –

+3

@VictorMukherjee di nuovo, loro (distruttore e finalizzatore) sono intercambiabili. È il 'Dispose()' che verrebbe chiamato * prima della distruzione, ma che non è indicato come distruttore o finalizzatore –