Condividi tramite


Inizializzazione e terminazione di componenti

Aggiornamento: novembre 2007

Il componente viene inizializzato dal relativo costruttore (SubNew in Visual Basic) e distrutto dal relativo distruttore (SubFinalizein Visual Basic). Il costruttore del componente viene chiamato durante, e non dopo, la creazione di un'istanza del componente. Il distruttore viene chiamato immediatamente prima della distruzione del componente mediante la procedura di Garbage Collection e del recupero della relativa memoria.

Nota di Visual Basic:

Nelle versioni precedenti di Visual Basic le funzioni degli eventi Initialize e Terminate erano identiche a quelle del costruttore e del distruttore.

Attesa della procedura di Garbage Collection

Common Language Runtime chiama il distruttore del componente dopo che la procedura di Garbage Collection determina che non è più possibile raggiungere il componente mediante l'esecuzione del codice. Questa situazione si verifica nel caso in cui tutti i riferimenti al componente siano stati rilasciati o se gli unici riferimenti al componente sono contenuti negli oggetti che a loro volta risultano non raggiungibili mediante l'esecuzione del codice, come nel caso dei riferimenti circolari.

Poiché è possibile che si verifichi un ritardo tra il momento in cui il componente non è più utilizzato dall'utente e il momento in cui viene chiamato il distruttore del componente, nella durata dei componenti .NET Framework viene introdotto un ulteriore passaggio: se il componente acquisisce risorse di sistema, quali connessioni a database o handle a oggetti del sistema Windows, sarà necessario implementare l'interfaccia IDisposable e fornire un metodo Dispose in modo da consentire agli utenti del componente di scegliere il momento in cui rilasciare le risorse.

Ciclo di vita di un componente

Inizializzazione del tipo: quando si crea la prima istanza del componente, la prima parte di codice eseguita è rappresentata da eventuali inizializzazioni condivise. Anche un riferimento a un eventuale membro condiviso comporta l'esecuzione del costruttore condiviso. In tale riferimento sono inclusi tutti i campi condivisi (variabili membro) inizializzati e, se presente, il costruttore condiviso (SharedSubNew). Nel codice riportato di seguito viene creato un tipo di carattere di riferimento per l'intera classe.

Nota:

La parola chiave C# corrispondente a Shared è static, che non deve essere confusa con la parola chiave Static di Visual Basic.

Quando implementare un metodo Dispose

Se il componente eredita da Component, verrà fornita un'implementazione predefinita del metodo Dispose. È possibile eseguire l'override di questa implementazione per fornire del codice di pulizia personalizzato. Se il componente viene generato mediante la creazione di un'implementazione personalizzata di IComponent, sarà necessario implementare IDisposable per fornire al componente un metodo Dispose.

Il componente necessita di un metodo Dispose nel caso in cui assegni oggetti di sistema, connessioni a database o altre risorse limitate da rilasciare subito dopo l'utilizzo del componente da parte dell'utente.

L'implementazione di un metodo Dispose è necessaria anche nel caso in cui il componente contenga riferimenti ad altri oggetti che dispongono di metodi Dispose.

Perché implementare un metodo Dispose

A seconda dell'attività di sistema, è possibile che un intervallo di tempo imprevisto trascorra tra il momento in cui il componente non viene più utilizzato da un utente e il momento in cui la procedura di Garbage Collection rileva che il codice del componente non è raggiungibile. Se non si fornisce un metodo Dispose, durante questo intervallo il componente continuerà a utilizzare le relative risorse.

Scenario del caso peggiore

Si consideri un componente server che utilizza una connessione a database e non dispone di un metodo Dispose. In un server che dispone di una grande quantità di memoria è possibile creare e rilasciare molte istanze del componente senza influire in modo significativo sulla memoria disponibile. In tal caso, è possibile che i componenti non vengano distrutti mediante la procedura di Garbage Collection per qualche tempo dopo il rilascio dei relativi riferimenti.

È inoltre possibile che tutte le connessioni al database disponibili vengano utilizzate dai componenti rilasciati ma non distrutti. In questo caso, anche se la memoria nel server non fosse insufficiente, il server potrebbe non essere in grado di rispondere alle richieste degli utenti.

Vedere anche

Attività

Procedura: creare e configurare componenti in modalità progettazione

Concetti

Caratteristiche delle classi di componenti

Modifiche alle istanze di componenti in Visual Basic

Riferimenti

Dispose

Finalize