Nope, .Net e hense C# fa affidamento su una gestione della memoria di garbage collection. Quindi i distruttori (che in .Net sono chiamati finalizzatori) non vengono chiamati fino a quando GC non riterrà opportuno distruggere gli oggetti.
Inoltre: la maggior parte degli oggetti "regolari" in C# non ha distruttori. Se è necessario il modello di distruttore, è necessario implementare lo IDisposable interface con Dispose Pattern. Su oggetti usa e getta si dovrebbe anche assicurarsi che venga chiamato il metodo Dispose, con lo using keyword o chiamando direttamente il metodo.
Per chiarire ulteriormente (si spera): lo smaltimento deterministico è utile in .Net per es. quando è necessario liberare esplicitamente risorse che non sono gestite dal runtime .Net. Esempi di tali risorse sono gli handle di file, le connessioni al database, ecc. Di solito è importante liberare queste risorse non appena non sono più necessarie. Quindi non possiamo permetterci di aspettare che il GC li liberi.
Per ottenere uno smaltimento deterministico (simile al comportamento dell'ambito di C++) nel mondo non deterministico del GC .Net, le classi .Net si basano sull'interfaccia IDisposable. Prendendo in prestito dal Dispose Pattern, ecco alcuni esempi:
In primo luogo, istanziare una risorsa usa e getta e poi lasciare che l'oggetto andare fuori portata, lascerà fino al GC di smaltire l'oggetto:
1. {
2. var dr = new DisposableResource();
3. }
Per risolviamo questo problema possiamo esplicitamente disporre dell'oggetto:
1. {
2. var dr = new DisposableResource();
3.
4. ...
5.
6. dr.Dispose();
7. }
Ma cosa succede se qualcosa va storto tra le linee 2 e 6? Smaltire non sarà chiamato. Per garantire, inoltre, che lo smaltimento sarà finalmente chiamato indipendentemente da eventuali eccezioni che possiamo fare la seguente:
1. var dr = new DisposableResource();
2. try
3. {
4. ...
5. }
6. finally
7. {
8. dr.Dispose();
9. }
Dal momento che questo modello è spesso necessaria, C# include la parola chiave usando per semplificare le cose. Il seguente esempio è equivalente a quanto sopra:
1. using (var dr = new DisposableResource())
2. {
3. ...
4. }
@RA - scusate il ritardo, ha avuto un po' Faccende IRL da fare :) Aggiunti alcuni esempi ora, spero che questo chiarisca ulteriormente. –