Domanda

Programma in .NET da quattro anni (principalmente C#) e utilizzo ampiamente IDiposable, ma devo ancora trovare la necessità di un finalizzatore.A cosa servono i finalizzatori?

È stato utile?

Soluzione

Un finalizzatore è un ultimo disperato tentativo di garantire che qualcosa viene pulita correttamente, e di solito è riservata per gli oggetti che avvolgono non gestite le risorse, come le maniglie non gestiti ecc che non verrà garbage collection.

E 'raro infatti di scrivere un finalizzatore. Per fortuna (e diversamente IDisposable), finalizzatori non hanno bisogno di essere propagato; quindi se avete un ClassA con un finalizzatore, ed un ClassB che avvolge ClassA, quindi ClassB non hanno bisogno di un finalizzatore -. ma abbastanza probabile sia ClassA e ClassB sarebbe implementare IDisposable

per il codice gestito, IDisposable è solitamente sufficiente. Anche se non pulire correttamente, alla fine gli oggetti gestiti avranno raccolto (ammesso che vengono rilasciati).

Altri suggerimenti

I finalizzatori servono solo per liberare non gestito risorse come gli handle bitmap GDI, ad esempio.Se non assegni risorse non gestite, non sono necessari finalizzatori.In generale è una cattiva idea toccarne qualcuno gestito oggetto in un finalizzatore perché l'ordine di finalizzazione non è garantito.

Un'altra tecnica utile che utilizza un finalizzatore consiste nell'asserire che Dispose è stato chiamato quando è necessario che l'applicazione lo faccia.Questo può aiutare a rilevare errori di codifica in una build DEBUG:

void Dispose()
{
  GC.SuppressFinalize(this);
}
#if DEBUG
~MyClass()
{
  Debug.Fail("Dispose was not called.");
}
#endif

Finalizzatori sono da intendersi come un meccanismo per rilasciare le risorse non controllate da spazzino, come una maniglia non gestito. Mentre Dispose potrebbe farlo, non è garantito che il consumatore lo chiamerà.

I finalizzatori sono per ripulire le risorse se non sono stati smaltiti.

IE, nulla impone che tu abbia mai chiamare Dispose (), ma finalizzatori siete chiamati automaticamente dal garbage collector.

Questa funzionalità non dovrebbe essere invocata, in quanto non v'è alcuna garanzia quando (o se) garbage collection si arriva a l'oggetto.

dice :

  

... un finalizzatore è un pezzo di codice che   assicura che certe azioni necessarie   sono prese quando una risorsa acquisita ...   non viene più utilizzato [perché la   oggetto possedere è stata spazzatura   raccolti]

E se non si sta usando un finaliser quando si scrive IDisposables hai molto probabilmente got perdite di memoria, perché non c'è alcuna garanzia di un proprietario è in realtà sta per chiamare Dispose ().

MS si consiglia si scrive qualcosa di simile a questo nella vostra implementatori:

    public void Dispose()
    {
        this.Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!this.isDisposed)
        {
            if (disposing)
            {
                GC.SuppressFinalize(this);
            }
        }
        //Dispose of resources here
        this.isDisposed = true;
    }

    ~DisposableSafe()
    {
        this.Dispose(false);
    }

    private bool isDisposed = false;

Personalmente, non posso sopportare il copia-incolla quindi tendo ad avvolgere che in una classe astratta per il riutilizzo.

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