18 votes

Comment détruire une classe statique en C# ?

J'utilise .net 1.1. J'ai une classe de session dans laquelle j'ai stocké de nombreuses variables statiques qui contiennent des données qui seront utilisées par de nombreuses classes.

Je veux trouver un moyen simple de détruire cette classe au lieu de réinitialiser chaque variable une par une. Par exemple, s'il existe une classe statique MyStatic, j'aurais voulu détruire/supprimer cette classe de la mémoire en écrivant MyStatic = null, ce qui n'est pas possible actuellement,

Question supplémentaire.

L'idée du singleton est bonne, mais j'ai les questions suivantes :

Si le singleton est mis en œuvre, l'objet "unique" restera toujours en mémoire. Dans singleton, nous vérifions seulement si une instance existe déjà. Comment puis-je m'assurer que cette variable d'instance sera également détruite ?

J'ai une classe principale qui initialise la variable dans la classe statique. Même si je prévois d'implémenter une méthode Rest(), je dois l'appeler à partir d'une méthode, par exemple, le destructeur de la classe principale. Mais ce destructeur n'est appelé que lorsque la GC collecte l'objet de la classe principale dans la mémoire, ce qui signifie que la méthode Reset() est appelée très tard.

merci pradeep

20voto

Kyle Trauberman Points 16049

N'utilisez pas une classe statique pour stocker vos variables. Utilisez une instance (et faites-en un singleton si vous ne voulez qu'une seule instance à la fois). Vous pouvez ensuite implémenter IDisposible, et appeler Dispose() lorsque vous voulez la détruire.

Pour plus d'informations, consultez ce site : http://csharpindepth.com/Articles/General/Singleton.aspx

EDIT

L'objet est toujours soumis à la collecte des déchets, donc à moins que vous n'utilisiez beaucoup de ressources non gérées, tout devrait bien se passer. Vous pouvez implémenter IDisposible pour nettoyer toutes les ressources qui doivent être nettoyées également.

9voto

ChrisW Points 37322

Au lieu d'une classe statique, ayez une instance statique d'une classe :

class Foo
{
  public int Something;
  public static Foo Instance = new Foo();
  public void Reset()
  {
    Instance = new Foo();
  }
}

void test
{
  int i = Foo.Instance.Something;
}

Vous pouvez également déléguer à une instance de la classe :

class Foo
{
  public int Something
  {
    get { return instance.something; }
  }
  private int something;
  private static Foo instance = new Foo();
  public void Reset()
  {
    instance = new Foo();
  }
}

void test
{
  int i = Foo.Something;
}

7voto

Brian Rasmussen Points 68853

Il n'y a aucun moyen de détruire un static à moins qu'il ne réside dans un AppDomain séparé, auquel cas vous pouvez vous en débarrasser en déchargeant l'AppDomain. Cependant, il est généralement préférable d'éviter les statics.

EDIT : Question supplémentaire

Lorsque le singleton ne sera plus référencé, il sera collecté comme tout le reste. En d'autres termes, si vous voulez qu'il soit collecté, vous devez vous assurer qu'il n'y a plus de références à ce singleton. Il va sans dire que si vous stockez une référence statique à votre singleton, vous aurez le même problème que précédemment.

2voto

Soviut Points 26384

Utilisez un Singleton comme l'a dit ktrauberman, et ayez une méthode d'initialisation ou une méthode de réinitialisation. Vous ne devez écrire le code qu'une seule fois et appeler la méthode.

2voto

user2831877 Points 3

Vous détruisez des objets, pas des classes. Il n'y a rien de mal avec les classes statiques - C# les fournit pour une raison. Les singletons ne sont qu'une surcharge supplémentaire, sauf si vous avez réellement besoin d'un objet, par exemple lorsque vous devez passer l'objet en tant que paramètre.

Les classes statiques ne contiennent que des variables statiques. Ces variables ont tendance à durer pendant toute la durée de vie de l'application, auquel cas vous n'avez pas à vous soucier de l'élimination des objets référencés, à moins que vous n'ayez un léger cas de TOC. Il ne reste plus que le cas où votre classe statique alloue et libère des ressources tout au long de sa vie. Disposez de ces objets en temps voulu comme vous le feriez habituellement (par exemple, "using...").

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