что происходит с событиями после удаления объекта, на который он ссылается? - PullRequest
1 голос
/ 18 августа 2011

что произойдет, если я связываю метод какого-либо объекта с делегатом, а затем избавляюсь от объекта?

Как это:

class Hunter
{
    public event Action Shoot;

    public execute()
    {
        Form formBabySeal = new Form();

        Shoot += formBabySeal.Close;

        formBabySeal.Show();
        formBabySeal.Close(); //Dispose Form

        if (Shoot != null)
        {
             Shoot(); //event is null?
        }
    }
}

Ответы [ 2 ]

1 голос
/ 18 августа 2011

formBabySeal не null только потому, что вы им распоряжаетесь.Итак, formBabySeal.Close() будет называться.

Ваш код эквивалентен этому при рассмотрении того, какие методы вызываются:

Form formBabySeal = new Form();

formBabySeal.Show();
formBabySeal.Close(); //Dispose Form
formBabySeal.Close();

Это закроет форму (первый вызов Close), а второй вызов не будетчто угодно, потому что форма уже закрыта.

Однако, как отмечает Стив в разделе комментариев, в вашем коде будет утечка памяти, потому что Shoot все еще содержит ссылку на Close метод formBabySeal и из-за этого formBabySeal будет оставаться в живых до тех пор, пока экземпляр класса Hunter жив.

0 голосов
/ 18 августа 2011

WinDBG с расширениями SOS позволяет показывать GCRoot любого объекта. Это может дать вам больше подсказок.

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