Статические члены когда-нибудь собирают мусор? - PullRequest
42 голосов
/ 06 июля 2011

Статические переменные-члены когда-нибудь собирают мусор?

Например, давайте используем следующий класс.

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

}

И предположим, что он используется так:

//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();

Когда a, b,c и d сборка мусора, статический член shared также собирается?Может ли e возможно получить новый экземпляр shared?

Ответы [ 2 ]

67 голосов
/ 06 июля 2011

Нет, статические члены связаны с типом, который связан с доменом приложения, в который он загружен.

Обратите внимание, что не должно быть любых экземпляров HasStatic для инициализируемого класса и переменной shared для ссылки на List<string>.

Если вы не рассматриваете ситуации, когда домены приложений выгружаются, статические переменные можно всегда рассматривать как корни GC. (Разумеется, если что-то изменит значение HasStatic.shared для ссылки на другой экземпляр, первый экземпляр может получить право на сборку мусора.)

29 голосов
/ 06 июля 2011

Единственное, что я хотел бы добавить к отличному ответу Джона, это то, что CLR 4 поддерживает «коллекционные сборки».Если вы динамически генерируете коллекционную сборку, то статика ее типов исчезает, когда сборка собирается мусором.

См. Эту статью MSDN для краткого обзора этой функции:

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

...