Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 12.04.2014, 16:07   #1
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Донный вопрос

Представим что у нас есть объект класса A. В одном из его методов передаем какое нить лямбда выражение в объект класса B, в котором сохраняется ссылка на него.
Что будит с лямбда выражением если на класс A потеряется ссылка в графе ссылок и условия для сборки мусора станут удачными. ?

Class Program
{
   private 
B _b;
   
void Main(string[] args)
   {
       
A a = new A();
       
_b = new B();
      
a.go(_b);
   }
}

Class 
A
{
     public 
go(B b)
     {
         
b.setAction(()=>{Debug.WriteLine("ololo");});
     }
}

Class 
B
{
    private 
Action _action;
    public 
void setAction(Action action)
    {
        
_action action;
    }

(Offline)
 
Ответить с цитированием
Старый 13.04.2014, 10:27   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Донный вопрос

В данном примере видимо лямбда выражение не связанно с классом A. И к чему такой вопрос? Поймал какие-то проблемы?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
radiobutton (14.04.2014)
Старый 13.04.2014, 18:07   #3
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Донный вопрос

Сообщение от pax Посмотреть сообщение
В данном примере видимо лямбда выражение не связанно с классом A. И к чему такой вопрос? Поймал какие-то проблемы?
Нет. просто было интересно всегда, а проверять никак руки не доходили.

а если так?)

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;
        }
    } 
(Offline)
 
Ответить с цитированием
Старый 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)
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:53.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com