Когда объект, объявленный в статическом классе, будет собирать мусор? - PullRequest
11 голосов
/ 10 марта 2011
 public static class stClass
{
    static Class1 obj = new Class1();

    public static int returnSomething()
    {
        return 0;
    }
}

Когда Class1 экземпляр obj в stClass будет собирать мусор, если я вызываю статическую функцию stClass.returnSomething() в каком-то другом нестатическом классе?

Примечание: Class1 это не статично

Ответы [ 3 ]

18 голосов
/ 10 марта 2011

Никогда, поскольку obj не реализует IDisposable.

Если вы имеете в виду, когда будет obj получать мусор, собранный , тогда ответ по-прежнему никогда - статические поля никогда не будутсборщик мусора и поэтому объект, на который ссылается obj, будет иметь право на сборку мусора только в том случае, если для obj задано значение null (или какой-либо другой объект) и у него нет других ссылок на этот объект:

obj = null;

(или если домен вашего приложения выгружен / процесс завершен)

3 голосов
/ 10 марта 2011

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

0 голосов
/ 10 марта 2011

Если Class1 реализует интерфейс IDisposable и имеет финализатор, среда выполнения попытается вызвать финализатор, когда домен приложения выгружен *. Если Class1 правильно следует шаблону dispose , финализатор должен вызвать dispose (false). Это будет правильное время для выгрузки любых неуправляемых ресурсов, используемых экземпляром Class1.

Однако при работе с объектом, который использует неуправляемые ресурсы, вы должны стремиться получить больший контроль над жизненным циклом объекта, а не просто запускать финализатор при завершении работы домена приложения.

* Даже финализатор не гарантированно будет вызываться при закрытии приложения ..

...