L'utilisation de Finaliser/méthode dispose en C#

C# 2008

J'ai travaillé sur cette question depuis un certain temps maintenant, et je suis toujours confus au sujet de l'utilisation de finaliser et de disposer de méthodes dans le code. Mes questions sont ci-dessous:

  1. Je sais que nous avons seulement besoin d'un outil de finalisation, tandis que l'élimination des ressources non managées. Cependant, si il y a des ressources gérées qui font appels à des ressources non managées, serait-il encore besoin de mettre en œuvre un finaliseur?

  2. Cependant, si je développe une classe qui n'utilise pas du tout non géré les ressources directement ou indirectement, dois-je mettre en œuvre les IDisposable pour permettre aux clients de cette classe à utiliser le 'l'aide de déclaration"?

    Serait-il possible de mettre en œuvre IDisposable juste pour permettre aux clients de votre classe à utiliser l'instruction à l'aide?

    using(myClass objClass = new myClass())
    {
        //Do stuff here
    }
  3. J'ai développé ce simple code ci-dessous pour illustrer le Finaliser/disposer d'utilisation:

    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);
        }
    }

Question sur le code source:

  1. Ici je n'ai pas ajouté le finaliseur, et normalement le finaliseur sera appelé par le GC, et le finaliseur fera appel à la Jeter. Comme je n'ai pas le finaliseur, quand dois-je appeler la méthode dispose? Est-ce le client de la classe qui a de l'appeler?

    Donc ma classe dans l'exemple est appelée NoGateway et le client pourrait utiliser et de disposer de la classe comme ceci:

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

    Serait la méthode dispose est automatiquement appelée lors de l'exécution atteint la fin de l'utilisation de bloc, ou le client manuellement l'appel de la méthode dispose? c'est à dire

    NoGateway objNoGateway = new NoGateway();
    //Do stuff with object
    objNoGateway.Dispose(); //finished with it
  2. Je suis en utilisant le WebClient classe dans mon NoGateway classe. Parce que WebClient met en œuvre la IDisposable interface, est-ce à dire que WebClient indirectement utilise des ressources non managées? Est-il une règle dure et rapide pour suivre ce? Comment puis-je savoir qu'une classe utilise des ressources non managées?

  • est-ce compliqué modèle de conception réellement nécessaires pour résoudre cette ressource relase problème ?
InformationsquelleAutor ant2009 | 2009-05-22