Будут ли сборочные параметры экземпляра, передаваемые в статические методы, собираться мусором? - PullRequest
2 голосов
/ 21 апреля 2010

Я знаю, что статические объекты в управляемом мире .Net загружаются в кучу загрузчика, которая никогда не будет собираться мусором.

Что происходит с ссылочными параметрами экземпляра, передаваемыми статическим методам. Получают ли они мусор после полного выполнения статической функции Или же они будут жить вечно, так как эти ссылочные переменные экземпляра будут переданы статическому методу?

Я очень смущен этим вечером; Пожалуйста, ведите меня.

Спасибо и всего наилучшего

123Developer.

Ответы [ 3 ]

3 голосов
/ 21 апреля 2010

Да, они собирают мусор после выполнения статической функции. Вы создаете объекты в нестатическом контексте, поэтому они не создаются в куче загрузчика. Простая передача ссылки на статическую функцию ничего не меняет.

2 голосов
/ 21 апреля 2010

То, что вы передаете ссылку на статический метод, никоим образом не означает, что объект будет каким-либо образом укоренен, так что одного этого недостаточно для предотвращения его сбора.

Возможность сбора данных во время вызова метода или только после его завершения зависит от того, что метод делает с аргументом, и от того, используется ли объект вне вызова метода.

Например, рассмотрим этот гипотетический код:

public static class Program()
{
    public static void Main()
    {
        SomeObject o = new SomeObject();
        OtherMethod(o);
    }

    private static void OtherMethod(SomeObject x)
    {
        // lots of code here, but none that uses x
    }
}

в этом случае o можно получить во время вызова OtherMethod, если вы скомпилируете и запустите сборку релиза. Для сборок релиза переменные и параметры, которые больше не используются, то есть нет кода, который его использует, считаются мертвыми и, следовательно, больше не учитываются при проверке наличия живых ссылок на объект.

В сборке Debug все переменные и параметры искусственно поддерживаются до тех пор, пока методы не возвращаются, так что вы можете установить точку останова и проверить переменную, даже если не осталось кода, который ее использует.

Так что, если бы вы запустили приведенный выше код из отладочной сборки, то объект оставался бы в живых, пока не вернется Main.

1 голос
/ 21 апреля 2010

Как только статический метод сделан с переменной, он больше не содержит ссылку на нее (если вы назначаете его статической переменной, это не так). Это не значит, что это будет мусор сразу же. Если вы специально не скажете GC запускаться, то когда он это делает, это зависит от того, когда среда выполнения чувствует, что ему нужно освободить память. По правде говоря, этого не может быть никогда в течение жизни приложения (ресурсы будут освобождены с окончанием приложения). Это, однако, очень маловероятно, хотя технически возможно.

...