2012-04-18 3 views
2

У меня есть код, который показан ниже. Меня спросили в интервьюЯвляется ли объект глобальным null или нет?

object global; 
void f() 
{ 
    object local=new object(); 
    global=local; 
} 

Он спросил: «Является ли глобальное null за пределами функции?». Поскольку переменная local теряет свою область вне функции и ее ссылка дана global, она также должна быть null, но это не почему?

+4

Если вы не вызовете 'F()', 'global' останется пустым. – leppie

+1

Если функция запущена, глобальный получит значение local и сохранит ее даже после завершения функции. Если нет, глобальное значение null –

+0

Да, функция вызывается, почему global не является нулевым. – Prabhavith

ответ

10

Вы должны различать переменные и значения.

Локальная переменная существует только внутри функции, но это не означает, что значение, которое содержит переменная, не существует вне функции.

Когда вы назначаете значение local на номер global, вы копируете ссылку на объект, чтобы две ссылки на один и тот же объект. Локальная переменная уходит, когда вы покидаете функцию, но значение, которое вы скопировали в глобальную переменную, по-прежнему существует, и объект сохраняется, поскольку по-прежнему существует ссылка на него.

+0

да .. ты тоже был прав. благодаря – Prabhavith

0

Я провел много исследований по этому вопросу и обнаружил, что единственная причина такого поведения связана с .Net Garbage Collection.

Корни GC не являются объектами сами по себе, а являются ссылками на объекты. Любой объект, на который ссылается корень GC, автоматически выживет в следующей сборке мусора.

Поскольку локальная переменная локальна, она останется в корне GC и, поскольку на нее ссылается глобальная, она выживает GC. Вы можете получить более подробную информацию в

http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

Смежные вопросы