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
?
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.)
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