C# a un constructeur statique qui effectue une initialisation. (Probablement faire une initialisation de ressource non managée) Je me demande s'il y a un destuctor statique?destructeur statique
Répondre
Non, il n'y en a pas.
Un destructeur statique serait supposé fonctionner à la fin de l'exécution d'un processus. Quand un processus meurt, toutes les mémoires/poignées associées sont libérées par le système d'exploitation. Si votre programme doit effectuer une action spécifique à la fin de l'exécution (comme un moteur de base de données transactionnel, vider son cache), il sera beaucoup plus difficile de gérer correctement qu'un simple code qui court à la fin de l'exécution normale du processus. Vous devez gérer manuellement les plantages et les interruptions inattendues du processus et essayer quand même de les récupérer à la prochaine exécution. Le concept de «destructeur statique» n'aiderait pas beaucoup.
Dans mon cas, j'utilisais un Mutex à l'échelle du système d'exploitation qui avait besoin d'être libéré, ou il émettait une exception AbandonedMutexException lors de la prochaine exécution de l'application. Dans ce cas, la mémoire et les poignées libérées à la fin du programme ne rendaient pas compte de mon Mutex. Ce que vous avez indiqué dans le troisième paragraphe pourrait être un moyen de le gérer, mais une fin de la version de l'application semblait avoir plus de sens pour moi. – user1132959
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'événement DomainUnload
sur le AppDomain
et y effectuer votre nettoyage.
Il s'agit en fait d'une approche beaucoup plus préférée de la suggestion 'Process_Exit' dont la valeur est plus élevée, ce qui est assez différent. La durée de vie d'un type après le démarrage de ctor statique est généralement la durée de vie de l'assembly, qui est déchargée avec AppDomain. – Abel
Non, il n'y a rien comme destructor pour les classes statiques mais vous pouvez utiliser l'événement Appdomain.Unloaded
si vous avez vraiment besoin de faire quelque chose
et nettoyage Initialiser des ressources non gérés à partir d'une mise en œuvre statique est très problématique et sujette à des problèmes.
Pourquoi ne pas utiliser un singleton, et mettre en œuvre un Finalizer
pour l'instance (un hériteront idéalement de SafeHandle
)
Pas exactement un destructor, mais voici comment vous le faire:
class StaticClass
{
static StaticClass() {
AppDomain.CurrentDomain.ProcessExit +=
StaticClass_Dtor;
}
static void StaticClass_Dtor(object sender, EventArgs e) {
// clean it up
}
}
parfait. Travaille pour moi. –
Bien que l'événement apparaisse sur AppDomain, il est en fait uniquement déclenché lorsque le domaine par défaut se termine (c'est-à-dire, le dernier domaine), juste avant que toute l'application ne meurt. Il ne se déclenchera pas lorsque tout autre AppDomain sera déchargé, ce qui entraînera la destruction de la plupart des types et des instances de types (mais pas toujours). Cet événement n'est pas [garanti pour toujours tirer.] (Http://blogs.msdn.com/b/jmstall/archive/2006/11/26/process-exit-event.aspx). – Abel
Je recommande de ne pas laisser les opérations de nettoyage sensibles jusqu'à la déconstruction d'une instance statique et suite à cette recommandation, vous n'aurez jamais besoin de vous inquiéter que cet événement ne se déclenche pas. Je n'ai jamais eu un problème où cet événement n'a pas eu lieu (même si des exceptions inattendues dans l'application ont eu lieu).Tuer un processus via le gestionnaire de tâches est très différent d'une exception inattendue. Vous avez raison cependant, il ne se déclenchera pas si l'utilisateur tue le programme via le système de gestion des tâches du système d'exploitation. –
Cette est le meilleur moyen (ref: https://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.
}
}
}
De cette façon est garanti de travailler! :) Essayez-le, j'ai des tests unitaires qui prouvent que cela fonctionne si quelqu'un est intéressé? –
Confirmé. Fonctionne comme un charme. –
A travaillé parfait, très lisse! – Steve
- 1. Comment effectuer une dés-initialisation statique si le destructeur a des effets secondaires et que l'objet est accédé à partir du destructeur d'un autre objet statique?
- 2. Destructeur de singletons
- 3. Destructeur en Objective-C++
- 4. Qt bibliothèque destructeur Question
- 5. Destructeur pour Singleton
- 6. C++ code destructeur
- 7. Constructeur appelant un destructeur
- 8. PHP: destructeur vs register_shutdown_function
- 9. Classe Destructeur Problème
- 10. Exception dans le destructeur
- 11. Exemple de destructeur C++
- 12. Effet secondaire/Volatile/Copie Constructeur/Destructeur
- 13. appel récursif involontaire dans destructeur
- 14. Suppression d'un objet avec un destructeur privé
- 15. Pourquoi mon destructeur n'est jamais appelé?
- 16. Ruby 1.8 vs 1.9 - rejet destructeur! opérateur
- 17. Constructeur et destructeur d'objet Excel VBA
- 18. Botan :: SecureVector - Destructeur appelé dans le constructeur?
- 19. Le destructeur inutilisé sera-t-il optimisé?
- 20. Destructeur vs course de fonction membre
- 21. variable ne statique "cette" méthode statique dans
- 22. Références de propriété statique Méthode non statique
- 23. Java statique paramétrée usine statique générique
- 24. Comment rendre ma classe statique moins statique?
- 25. Service Web statique sur non statique
- 26. Méthode statique usine statique [getInstance()] dans Java?
- 27. ActionScript Définition d'un tableau statique statique
- 28. Win32 alternative pour le destructeur dans pthread_keycreate (quand je ne peux pas contrôler dllmain)
- 29. Comportement de destructeur différent entre vc9 et gcc
- 30. Problèmes Xerces-C; segfault sur appel à un destructeur d'objet
+1 pour ce drôle de commentaire, leppie. Et je voudrais souligner que les ressources statiques ont la plupart du temps la même durée de vie que l'application. Ils meurent quand l'application meurt. Donc, il n'y a pas besoin d'un destructeur statique. – decyclone
"donc il n'y a pas besoin d'un destructeur statique" - comment ces deux choses sont-elles liées? Parce que cela ne se produirait que lorsque l'appdomain serait déchargé, ce n'est plus nécessaire? Je ne suis pas sûr de suivre la logique ici. – BrainSlugs83