Показать сообщение отдельно
Старый 14.04.2014, 11:27   #4
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Ответ: Донный вопрос

В первом примере, как сказал pax, копируется сама лямбда - ()=>{Debug.WriteLine("ololo");} - а не "часть" экземпляра класса А.

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

static void Main()
      {
         var 
= new A();
         var 
= new B();

         
a.go(b);

         for (
int i 010000i++)
         {
            var 
garbage = new byte[1024 1024];
            
GC.Collect();
         }

         
Console.Read();
      }

      class 
A
      
{
         public 
void go(B b)
         {
            
b.setAction(lambda);
         }

         private 
void lambda(object e)
         {
            
Debug.WriteLine("ololo");
         }
      }

      class 
B
      
{
         public 
delegate void lol(object o);
         
lol _action;
         public 
void setAction(lol action)
         {
            
_action action;
         }
      } 
Если поставить точку останова после/на Console.Read(), видно, что оба экземпляра живы.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо johnk за это полезное сообщение:
pax (14.04.2014), radiobutton (14.04.2014)