Предотвращает ли GC использование лямбда-выражения no-op для инициализации события? - PullRequest
2 голосов
/ 09 февраля 2011

Можно использовать следующую конструкцию для объявления события:

public class MyClass
{
    public event EventHandler<EventArgs> SomeEvent = (s,e) => {};

    public void SomeMethod ()
    {
        // Do something interesting... ;)
        SomeEvent (this, new EventArgs);
    }
}

Это позволяет вызвать событие без необходимости проверять, является ли событие нулевым.

Теперь, скажем, чтообъект A содержит ссылку на объект MyClass, регистрируется для события, а затем отменяет его регистрацию.

var myClass = new MyClass();
myClass.SomeEvent += MyHandler;
...
myClass.SomeEvent -= MyHandler;
myClass = null;

Будет ли сборщик мусора собирать myClass, даже если насобытие?

Я так думаю, потому что корень объекта больше не является ссылкой на другие объекты ... Кто-нибудь может подтвердить или доказать обратное?

Ответы [ 2 ]

6 голосов
/ 09 февраля 2011

Экземпляр MyClass можно собрать, даже если вы не удалили «настоящий» обработчик.

Обычная «утечка» с событиями заключается в том, что событие publisher (MyClass в данном случае) имеет ссылку на другой объект через подписанные обработчики событий.События не мешают сборщику мусора publisher .Безоперационная лямбда, безусловно, не влияет на это.

3 голосов
/ 09 февраля 2011

С кодом в вопросе GC будет собирать myClass, даже если вы не отписываетесь. Отношение наоборот. Событие MyClass содержит ссылку на подписчика, поэтому теоретически вы должны быть обеспокоены тем, что подписчик не будет собран. Если вы отмените подписку, подписчик будет собран.

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