Domanda

Sto guardando un po 'di codice e ha questa affermazione:

~ConnectionManager()
{
    Dispose(false);
}

La classe implementa l'interfaccia IDisposable , ma non so se questo faccia parte della tilde (~).

È stato utile?

Soluzione

~ è il distruttore

  1. I distruttori sono invocati automaticamente e non possono essere invocati esplicitamente.
  2. I distruttori non possono essere sovraccaricati. Pertanto, una classe può avere al massimo un distruttore.
  3. I distruttori non sono ereditati. Pertanto, una classe non ha distruttori diversi da quello, che può essere dichiarato in essa.
  4. I distruttori non possono essere usati con le strutture. Sono usati solo con le classi. Un'istanza diventa idonea alla distruzione quando non è più possibile per nessun codice utilizzare l'istanza.
  5. L'esecuzione del distruttore per l'istanza può verificarsi in qualsiasi momento dopo che l'istanza diventa idonea alla distruzione.
  6. Quando un'istanza viene distrutta, i distruttori nella sua catena di eredità vengono chiamati, in ordine, dalla maggior parte derivata alla meno derivata.

Finalizza

In C #, il metodo Finalize esegue le operazioni che farebbe un distruttore C ++ standard. In C #, non lo chiami Finalizza: usi la sintassi del distruttore C ++ per posizionare un simbolo tilde (~) prima del nome della classe.

Smaltire

È preferibile disporre degli oggetti in un metodo Close () o Dispose () che può essere chiamato esplicitamente dall'utente della classe. Finalize (destructor) sono chiamati dal GC.

L'interfaccia IDisposable dice al mondo che la tua classe si aggrappa alle risorse che devono essere smaltite e offre agli utenti un modo per rilasciarle. Se devi implementare un finalizzatore nella tua classe, il tuo metodo Dispose dovrebbe utilizzare il metodo GC.SuppressFinalize () per garantire che la finalizzazione della tua istanza venga soppressa.

Cosa usare?

Non è legale chiamare esplicitamente un distruttore. Il distruttore verrà chiamato dal garbage collector. Se gestisci preziose risorse non gestite (come gli handle di file) che desideri chiudere e smaltire il più rapidamente possibile, devi implementare l'interfaccia IDisposable.

Altri suggerimenti

Questo è un finalizzatore . Ad essere onesti, dovresti raramente scrivere un finalizzatore. Devi solo scriverne uno se:

  • Hai accesso diretto a una risorsa non gestita (ad es. tramite un IntPtr ) e non puoi utilizzare SafeHandle che semplifica
  • Stai implementando IDisposable in una classe che non è sigillata. (La mia preferenza è quella di sigillare le classi a meno che non siano progettate per l'ereditarietà.) In questi casi un finalizzatore fa parte del modello di eliminazione canonico.

È usato per indicare il distruttore per la classe.

Come C ++, è il distruttore; tuttavia in C # non lo chiami esplicitamente, viene invocato quando l'oggetto viene raccolto.

Vedi Destructors (Guida per programmatori C #) . Tenere presente, tuttavia, che, diversamente dal C ++, il programmatore non ha alcun controllo su quando viene chiamato il distruttore perché questo è determinato dal Garbage Collector.

~ di solito rappresenta un decostruttore. che viene eseguito proprio prima che un oggetto muoia.

Ecco una descrizione dei decostruttori C # che ho trovato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top