78 votes

statique destructeur

c# a constructeur statique qui n'certains d'initialisation. (Probablement Faire quelques non managé des ressources d'initialisation) je me demande s'il est statique destuctor?

115voto

zackery.fix Points 489

Pas exactement un destructeur, mais voici comment vous pourriez faire:

class StaticClass 
{
   static StaticClass() {
       AppDomain.CurrentDomain.ProcessExit +=
           StaticClass_Dtor;
   }

   static void StaticClass_Dtor(object sender, EventArgs e) {
        // clean it up
   }
}

74voto

Tod Thomson Points 1145

C'est le meilleur moyen (réf.: http://stackoverflow.com/a/256278/372666)

public static class Foo
{
    private static readonly Destructor Finalise = new Destructor();

    static Foo()
    {
        // One time only constructor.
    }

    private sealed class Destructor
    {
        ~Destructor()
        {
            // One time only destructor.
        }
    }
}

41voto

Mehrdad Afshari Points 204872

Non, il n'y en a pas.

Statique destructeur de soi-disant aurait exécuté à la fin de l'exécution d'un processus. Lorsqu'un processus meurt, toute la mémoire/poignées associées à il sera libéré par le système d'exploitation.

Si votre programme doit faire une action spécifique à la fin de l'exécution (comme une base de données transactionnelle moteur, rinçage son cache), il va être beaucoup plus difficile à gérer correctement que juste un morceau de code qui s'exécute à la fin de l'exécution normale du processus. Vous devez manuellement gérer les blocages et la fermeture inattendue du processus et tenter de le récupérer lors de la prochaine exécution de toute façon. La "statique destructeur" concept ne serait pas beaucoup.

17voto

Neil Knight Points 23759

Non, il n'y en a pas. La chose la plus proche que vous pouvez faire est de définir un gestionnaire d'événements à l' DomainUnload d'un événement sur l' AppDomain et effectuer votre nettoyage il.

6voto

Dean Chalk Points 7935

Initialisation et de nettoyage des ressources non gérées à partir d'une Statique de la mise en œuvre est tout à fait problématique et sujette à des problèmes.

Pourquoi ne pas utiliser un singleton, et de mettre en œuvre un Finalizer pour l'instance (d'un emplacement idéal hériter d' SafeHandle)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X