Подтвердить что ты не робот

Статические члены собирают сбор мусора?

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

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

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?

4b9b3361

Ответ 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