Статические члены собирают сбор мусора?
Статические переменные-члены когда-либо собирают мусор?
Например, можно использовать следующий класс.
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
?
Ответы
Ответ 1
Нет, статические члены связаны с типом, который связан с загруженным им AppDomain.
Обратите внимание, что для инициализируемого класса не должно быть экземпляров HasStatic
, а переменная shared
должна иметь ссылку на List<string>
.
Если вы не рассматриваете ситуации, когда AppDomains разгружаются, статические переменные можно считать корнями GC навсегда. (Конечно, если что-то изменяет значение HasStatic.shared
для ссылки на другой экземпляр, первый экземпляр может получить право на сбор мусора.)
Ответ 2
Единственное, что я хотел бы добавить к Джону, - это то, что CLR 4 поддерживает "коллекционные сборки". Если вы динамически генерируете сборную сборку, тогда статика ее типов исчезает, когда сборка собирает мусор.
См. эту статью msdn для краткого обзора функции:
http://msdn.microsoft.com/en-us/library/dd554932%28VS.100%29.aspx