Finalize / Dispose-Muster in C #

C# 2008

Habe ich die Arbeit auf diesem für eine Weile jetzt, und ich bin immer noch verwirrt über einige Probleme. Meine Fragen sind unten

  1. Ich weiß, dass Sie nur finalizer, wenn Sie die Entsorgung von nicht verwalteten Ressourcen. Allerdings, wenn Sie mit verwalteten Ressourcen, die Anrufe zu nicht verwalteten Ressourcen, würden Sie noch brauchen, um einen finalizer implementieren?
  2. Jedoch, wenn Sie entwickeln eine Klasse, die nicht alle nicht verwalteten Ressourcen, direkt oder indirekt, können Sie implementieren die IDisposable so, dass die clients Ihrer Klasse verwenden können, die 'Anweisung'?

    Wäre es akzeptabel, implementiert die IDisposable-gerade so, dass Kunden von Ihrer Klasse können die using-Anweisung?

    using(myClass objClass = new myClass())
    {
        //Do stuff here
    }
  3. Entwickelt ich diese einfach folgenden code zeigen Sie die Finalize/dispose-Muster:
    public class NoGateway : IDisposable
    {
        private WebClient wc = null;
    
        public NoGateway()
        {
            wc = new WebClient();
            wc.DownloadStringCompleted += wc_DownloadStringCompleted;
        }
    
    
        //Start the Async call to find if NoGateway is true or false
        public void NoGatewayStatus()
        {
            //Start the Async's download
                //Do other work here
            wc.DownloadStringAsync(new Uri(www.xxxx.xxx));
        }
    
        private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            //Do work here
        }
    
        //Dispose of the NoGateway object
        public void Dispose()
        {
            wc.DownloadStringCompleted -= wc_DownloadStringCompleted;
            wc.Dispose();
            GC.SuppressFinalize(this);
        }
    }

Frage zum Quelltext:

  1. Hier habe ich nicht Hinzugefügt haben, die Sie in Gang gesetzt, und in der Regel der finalizer aufgerufen wird von GC, und der finalizer wird die Dispose. Da ich nicht der finalizer, wenn ich die Dispose-Methode aufrufen? Ist es der client der Klasse, die es zu nennen?

    Also meine Klasse ist die im Beispiel genannte NoGateway und der client verwenden könnte, und entsorgen Sie die Klasse wie folgt aus:

    using(NoGateway objNoGateway = new NoGateway())
    {
        //Do stuff here   
    }

    Würden die Dispose-Methode automatisch aufgerufen, wenn die Ausführung erreicht das Ende des using-block, oder muss der client manuell aufrufen der dispose-Methode? also

    NoGateway objNoGateway = new NoGateway();
    //Do stuff with object
    objNoGateway.Dispose(); //finished with it
  2. Ich bin mit der webclient-Klasse in meinem NoGateway Klasse. Da der webclient implementiert die IDisposable-Schnittstelle, bedeutet dies, dass der webclient indirekt verwendet, nicht verwaltete Ressourcen? Gibt es eine harte und schnelle Regel Folgen diese? Woher weiß ich, dass eine Klasse nicht verwaltete Ressourcen verwendet?

InformationsquelleAutor der Frage ant2009 | 2009-05-22

Schreibe einen Kommentar