Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale
Questo argomento non è stato ancora valutato - Valuta questo argomento

Metodo Object::Finalize

Consente a un oggetto di provare a liberare risorse ed eseguire altre operazioni di pulizia prima che l'oggetto stesso venga reclamato dalla procedura di Garbage Collection.

Spazio dei nomi:  System
Assembly:  mscorlib (in mscorlib.dll)
protected:
virtual void Finalize()

Il metodo Finalize è utilizzato per eseguire operazioni di pulizia su risorse non gestite mantenute dall'oggetto corrente prima che venga eliminato l'oggetto corrente. Il metodo è protetto, pertanto è accessibile soltanto attraverso questa classe o una classe derivata.

Il metodo viene chiamato automaticamente dopo che un oggetto è divenuto inaccessibile, a meno che l'oggetto non sia stato esonerato dalla finalizzazione attraverso una chiamata al metodo GC::SuppressFinalize . Durante l'arresto di un dominio applicazione, l'oggetto Finalize viene chiamato automaticamente su oggetti che non sono esenti da finalizzazione, anche quelli ai quali è ancora possibile accedere. La chiamata automatica a Finalize viene eseguita soltanto una volta per una determinata istanza, a meno che l'oggetto venga registrato nuovamente attraverso un meccanismo quale GC::ReRegisterForFinalize e che GC::SuppressFinalize non sia stato successivamente chiamato.

Ogni implementazione di Finalize in un tipo derivato deve chiamare la propria implementazione di Finalize del tipo di base. Questo è l'unico caso in cui il codice dell'applicazione può chiamare il metodo Finalize.

NotaNota

Poiché il compilatore C# non consente all'utente di implementare direttamente il metodo Finalize, un distruttore C# chiama automaticamente il distruttore della classe di base.

Le operazioni di Finalize hanno i seguenti limiti:

  • Non è definito il momento esatto in cui viene eseguito il finalizzatore durante la procedura di Garbage Collection. Non è certo che le risorse vengano rilasciate in un dato momento, a meno che non si chiami un metodo Close o Dispose.

  • Non è certo che i finalizzatori di due oggetti vengano eseguiti in un ordine specifico, anche se un oggetto fa riferimento all'altro. Vale a dire, se l'Oggetto A ha un riferimento all'Oggetto B ed entrambi dispongono di finalizzatori, è probabile che l'Oggetto B sia già stato finalizzato quando viene avviato il finalizzatore dell'Oggetto A.

  • Non è specificato il thread su cui viene eseguito il finalizzatore.

Il metodo Finalize potrebbe non essere completato o non essere avviato affatto nei seguenti casi eccezionali:

  • Un altro finalizzatore è bloccato in modo indefinito, ossia è entrato in un ciclo infinito, esegue il tentativo di ottenere un blocco che non potrà mai ottenere e così via. Poiché viene eseguito il tentativo di completare i finalizzatori ad parte del runtime, gli altri finalizzatori non potranno essere chiamati se uno di essi è bloccato in modo indefinito.

  • Il processo termina senza aver dato alcuna possibilità al runtime di eseguire una pulizia. In questo caso, la prima notifica di completamento del processo effettuata dal runtime è una notifica DLL_PROCESS_DETACH.

Il runtime continua a utilizzare il metodo Finalize sugli oggetti durante la chiusura soltanto quando il numero di oggetti finalizzabili continua a diminuire.

Se il metodo Finalize o un override di Finalize genera un'eccezione e il runtime non è contenuto in un'applicazione che esegue l'override dei criteri predefiniti, il runtime termina il processo e nessun blocco try-finally o finalizzatori vengono eseguiti. Questo comportamento garantisce l'integrità del processo qualora il finalizzatore non possa liberare o distruggere risorse.

Note per gli implementatori

Object.Finalize non effettua alcuna operazione predefinita. Deve essere sottoposto a override da una classe derivata soltanto se necessario, perché il recupero durante la procedura di Garbage Collection tende a durare più a lungo se deve essere eseguita un'operazione di Finalize.

Se un oggetto Object contiene riferimenti a risorse, Finalize deve essere sottoposto a override da una classe derivata perché possa liberare queste risorse prima che l'oggetto Object venga eliminato durante la procedura di Garbage Collection.

Il metodo Finalize deve essere implementato da un tipo quando utilizza risorse non gestite, ad esempio handle di file o connessioni di database che devono essere rilasciate quando l'oggetto gestito che le utilizza viene recuperato. Per ulteriori informazioni su strumenti complementari e più semplici da gestire per l'eliminazione delle risorse, vedere l'interfaccia IDisposable.

Finalize è in grado di intraprendere qualsiasi azione, tra cui ripristinare un oggetto, ovvero renderlo di nuovo accessibile, dopo averlo pulito durante la procedura di Garbage Collection. L'oggetto può, tuttavia, essere ripristinato soltanto una volta; Finalize non può essere chiamato su oggetti ripristinati durante la procedura di Garbage Collection.

I distruttori rappresentano il meccanismo di C# per eseguire le operazioni di pulizia. I distruttori forniscono una protezione appropriata, ad esempio chiamando automaticamente il distruttore del tipo di base. Nel codice C# non è possibile chiamare o eseguire l'override di Object.Finalize.

Nell'esempio seguente si verifica che venga chiamato il metodo Finalize quando viene eliminato un oggetto che esegue l'override di Finalize. Si noti che, in un'applicazione di produzione, l'override del metodo Finalize verrebbe eseguito per rilasciare risorse non gestite mantenute dall'oggetto. Si noti inoltre che nell'esempio C# viene fornito un distruttore e non viene eseguito l'override del metodo Finalize.

Non sono attualmente disponibili esempi di codice o questo linguaggio potrebbe non essere supportato.

.NET Framework

Supportato in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.
Il documento è risultato utile?
(1500 caratteri rimanenti)

Aggiunte alla community

AGGIUNGI
Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
© 2013 Microsoft. Tutti i diritti riservati.