То, что вы передаете ссылку на статический метод, никоим образом не означает, что объект будет каким-либо образом укоренен, так что одного этого недостаточно для предотвращения его сбора.
Возможность сбора данных во время вызова метода или только после его завершения зависит от того, что метод делает с аргументом, и от того, используется ли объект вне вызова метода.
Например, рассмотрим этот гипотетический код:
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.