web-dev-qa-db-fra.com

Les membres statiques sont-ils déjà récupérés?

Les variables membres statiques sont-elles jamais récupérées?

Par exemple, utilisons la classe suivante.

public class HasStatic {
    private static List<string> shared = new List<string>();

}

Et supposé qu'il est utilisé comme ceci:

//Startup
{
HasStatic a = new HasStatic();
HasStatic b = new HasStatic();
HasStatic c = new HasStatic();
HasStatic d = new HasStatic();
//Something
}
//Other code
//Things deep GC somewhere in here
HasStatic e = new HasStatic();

Lorsque a, b, c et d sont récupérés, le membre statique shared est-il également collecté? e pourrait-il éventuellement obtenir une nouvelle instance de shared?

45
C. Ross

Non, les membres statiques sont associés au Type, qui est associé à l'AppDomain dans lequel il est chargé.

Notez qu'il n'est pas nécessaire qu'il y ait any instances de HasStatic pour que la classe soit initialisée et que la variable shared ait une référence à un List<string>.

Sauf si vous envisagez des situations où les AppDomains sont déchargés, les variables statiques peuvent être considérées comme des racines GC pour toujours. (Bien sûr, si quelque chose change la valeur de HasStatic.shared pour référencer une instance différente, la première instance peut devenir éligible pour le garbage collection.)

75
Jon Skeet

La seule chose que j'ajouterais à l'excellente réponse de Jon est que CLR 4 prend en charge les "assemblages à collectionner". Si vous générez dynamiquement un Assembly collectable, la statique de ses types disparaît lorsque l'Assembly est garbage collection.

Consultez cet article msdn pour un bref aperçu de la fonctionnalité:

http://msdn.Microsoft.com/en-us/library/dd554932%28VS.100%29.aspx

30
Eric Lippert