Differenza tra smaltimento e finalizzazione

Nei linguaggi di programmazione, un oggetto può avere solo variabili durante la sua esistenza, dopo l'istanziazione non può essere modificato. Quindi la stessa cella di memoria non può essere allocata a nuovi valori, quindi è necessaria una sorta di gestione automatica della memoria per gestire gli spazi non utilizzati. Questi spazi non utilizzati sono chiamati garbage e l'intero processo di gestione efficiente della memoria è chiamato garbage collection.

L'obiettivo principale di un garbage collector è separare gli oggetti morti dagli oggetti live e recuperare lo spazio per il riutilizzo. Fondamentalmente, tutto funziona su heap gestito, che non è altro che un blocco di memoria e il garbage collector controlla periodicamente la memoria heap per allocare memoria ai nuovi oggetti. Esistono due metodi per rilasciare risorse non gestite come i file e le connessioni al database: Dispose e Finalize.

Questo articolo ti aiuta a capire la differenza tra i due.

Che cos'è un metodo di smaltimento?

Dispose è un modo standard per gli utenti di dire agli oggetti di rilasciare le loro risorse e non tentare di accedere nuovamente agli oggetti. Il metodo dispose fornisce il controllo della pulizia della memoria esplicita rendendo gli oggetti inutilizzabili.

Quando gli utenti chiamano il metodo Dispose (), l'oggetto dovrebbe liberare tutte le sue costose risorse rendendolo così disponibile per il riutilizzo. Non viene mai chiamato dal garbage collector che viene in gioco solo quando la memoria gestita diventa scarsa. Un'interfaccia speciale chiamata "IDisposable" viene utilizzata per decidere dove e come implementare Dispose (). Ma cosa succede quando il metodo di smaltimento non viene chiamato?

Che cos'è un metodo di finalizzazione?

Se il metodo di eliminazione non viene chiamato, il piano di fallback consiste nell'utilizzare il metodo Finalize () per la pulizia. Viene chiamato dal garbage collector per eseguire una pulizia definitiva delle risorse prima che libera la memoria. Il concetto di pulizia tempestiva diventa inapplicabile qui perché piuttosto che de-allocare immediatamente la memoria, l'oggetto viene aggiunto alla coda di finalizzazione solo per essere distrutto in seguito. Finalizzare è più simile a una salvaguardia messa in atto in caso di errore di programmazione e lo smaltimento non ripulisce le risorse, nel qual caso il metodo Finalize () viene chiamato dal garbage collector per rimuovere gli oggetti non raggiungibili in qualsiasi sequenza desideri.

Differenza tra Dispose e Finalize

Nozioni di base di smaltimento e finalizzazione

Il metodo di eliminazione viene chiamato per accelerare il rilascio di risorse non gestite come handle di database, handle di file, semafori e altri oggetti allocati dal sistema operativo. Il metodo di eliminazione viene invocato per eseguire il codice richiesto per ripulire la memoria inutilizzata e le scarse risorse come gli handle GDI. In termini semplici, il metodo dispose fornisce il controllo della pulizia esplicita della memoria. Il metodo Finalize, d'altra parte, fa parte della garbage collection utilizzata per eseguire l'operazione di clean-up finale su un oggetto prima di essere sottoposto a garbage collection. In poche parole, il metodo finalize viene chiamato per liberare risorse non gestite detenute da un oggetto prima che venga distrutto.

Invocazione di Dispose e Finalize

Il metodo di eliminazione può essere chiamato esplicitamente dal codice utente e dalla classe che implementa il metodo per disporre le risorse. Tuttavia, la memoria non può essere rilasciata fino a quando il garbage collector non esegue il processo di pulizia. Il metodo può essere chiamato anche se esistono ancora altri riferimenti all'oggetto. Il metodo finalize, al contrario, può essere richiamato dal garbage collector solo dopo aver determinato che l'ultima istanza dell'oggetto di memoria è stata distrutta e che non esistono più riferimenti all'oggetto. Dopo l'esecuzione del metodo finalize, l'oggetto viene rimosso dalla memoria heap.

Implementazione di Dispose and Finalize

Il processo di smaltimento di un oggetto dalla memoria è denominato schema di eliminazione, che può essere utilizzato per oggetti che accedono a risorse non gestite poiché il Garbage Collector non è in grado di recuperare risorse non gestite. L'interfaccia "IDisposable" e un metodo Dispose (Boolean) aggiuntivo sono implementati per richiedere il rilascio di risorse non gestite. Un metodo finalize viene eseguito quando l'istanza di un oggetto viene distrutta prima della sua deallocazione. È un metodo non deterministico che si verifica a discrezione del garbage collector e potrebbe non verificarsi nemmeno. Non dovrebbe essere implementato su oggetti gestiti fino a quando estremamente necessario.

Prestazioni di smaltimento e finalizzazione

È molto più veloce utilizzare un metodo di smaltimento piuttosto che finalizzare per lo smaltimento immediato degli oggetti. I distruttori vengono convertiti automaticamente nel metodo di finalizzazione in fase di runtime. Viene automaticamente richiamato dal garbage collector quando l'oggetto esce dall'ambito, cosa che di solito accade quando l'istanza di quell'oggetto viene distrutta. Il problema con il metodo finalize è che è un significato non deterministico che non è certo quando recuperare la memoria che non viene più referenziata attraverso la garbage collection. Tuttavia, potrebbe non liberare immediatamente la memoria; infatti, potrebbe non essere mai chiamato e non può essere forzato in modo esplicito.

Dispose vs. Finalize: Tabella di confronto

Riepilogo di Dispose vs Finalize

La principale differenza tra i metodi dispose e finalize è che il primo è un metodo deterministico che elimina immediatamente gli oggetti quando non sono più in uso, mentre il secondo è un metodo non deterministico per allocare risorse non gestite, il che significa che è un metodo di backstop per liberare istanze di oggetti di memoria quando escono dall'ambito prima della loro deallocazione. È sempre consigliabile utilizzare il metodo di smaltimento per finalizzare, a meno che non sia estremamente necessario.

In altri termini, finalizzare è una salvaguardia messa in atto per ripulire le risorse non gestite quando non è possibile chiamare il metodo in caso di un errore di programmazione. Il metodo finalize viene chiamato dal garbage collector quando un oggetto sta per essere espulso dalla memoria heap.