Я читал главу «Сборка мусора» из прекрасной книги Джеффри Рихтера «CLR via C #». Там он проиллюстрировал пример того, как GC концептуально работает (как помечены корни), ссылаясь на список разборки нативного кода, генерируемого компилятором JIT. Из этого примера мне пришло в голову, что вложенные ссылочные типы в области видимости имеют нулевой эффект для ускорения сборки мусора вложенной переменной. Интересно, правильно ли я это понимаю. В любом случае рассмотрим эти 2 версии кода:
A) Вложение переменной ссылочного типа (y) во внутреннюю область видимости:
namespace scope
{
class A { public void foo() { } }
class Program
{
static void Main(string[] args)
{
A x = new A();
x.foo();
{
A y = new A();
y.foo();
}
}
}
}
B) То же, что и выше, за исключением того, что x и y находятся в одной и той же области видимости.
namespace scope
{
class A { public void foo() { } }
class Program
{
static void Main(string[] args)
{
A x = new A();
x.foo();
A y = new A();
y.foo();
}
}
}
Из любопытства я проверил сгенерированный код IL для обеих версий, и они ЖЕ!
В1: Итак, это, похоже, подразумевает, что на самом деле определение объема не ускоряет сбор мусора. Это правильно? (Примечание: я знаю об операторе «using», но мне интересно только поведение GC «простой старой области», как показано в 2 приведенных выше примерах.)
Q2: Если ответ на вопрос Q1 «Верный», то я совершенно сбит с толку тем, как может произойти ситуация «Время жизни объекта не определяется областью действия», как описано здесь:
http://www.curly -brace.com / favorite.html