C # Лямбда Объектная Область - PullRequest
0 голосов
/ 27 февраля 2011

Я только что смотрел видео TekPub на Lambda, и код был похож на такой:

class Foo{
   void DoSomething();
}

static void Bar(Foo item, Action<Foo> action){
   return action.Invoke(item);
}

А потом в основном:

Bar(new Foo(), x=>x.DoSomething();

У меня такой вопрос, находится ли объект Foo в пределах области видимости для этого вызова Bar? Уничтожается ли объект после вызова этого метода?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

В данном конкретном случае происходит то, что объект foo вместе с вашим делегатом передается методу Bar.Метод Bar вызывает действие, которое вызывает DoSomething для foo, а затем возвращает.

Поскольку метод Bar не возвращает ни объект, который вы передаете ему, ни результат вызова делегата, ни соответствующий кодссылка на объект нигде не хранится, созданный вами объект foo теперь имеет право на сборку мусора после возврата Bar.

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

0 голосов
/ 27 февраля 2011

Да, его следует утилизировать после возврата из метода, поскольку ни одна из операций не создает дополнительную ссылку.

Однако это не общий случай, это действительно зависит от того, что метод делает с ним - если он создает новый объект со ссылкой на созданный встроенный объект, он может жить после того, как метод вернулся.В этом случае Action<T> может добавить Foo в словарь или какой-либо список, что будет означать, что он не будет собирать мусор, так как на него все еще есть ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...