Безопасно ли добавлять делегатов на мероприятия с ключевым словом new? - PullRequest
6 голосов
/ 19 сентября 2008

Одна вещь, которая меня беспокоит, - это то, что я обнаружил два способа регистрации делегатов на события.

  1. OnStuff + = this.Handle;
  2. OnStuff + = новый StuffEventHandler (this.Handle);

Первый - чистый, и имеет смысл делать «OnStuff - = this.Handle;» отменить регистрацию в событии ... Но в последнем случае я должен сделать "OnStuff - = new StuffEventHandler (this.Handle);"? Такое ощущение, что я вообще ничего не удаляю, так как добавляю другую ссылку StuffEventHandler. Событие сравнивает делегата по ссылке? Я обеспокоен тем, что мог бы создать неприятный пул памяти здесь. Поймай меня? У меня нет ссылки на "новый StuffEventHandler", который я ранее зарегистрировал.

В чем недостаток выполнения # 1?

Какая польза от занятия №2?

Ответы [ 4 ]

10 голосов
/ 19 сентября 2008

Номер один - это просто сокращение, которое будет генерировать тот же MSIL, что и второй, при типе компиляции он будет смотреть на this.Handle и выводит делегат для создания экземпляра. Но вы никогда не должны отписываться, используя new.

Так что нет никакой разницы между двумя, просто какой-то синтаксический сахар, чтобы сделать наш код чище.

6 голосов
/ 19 сентября 2008

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

Когда вы вызываете "OnStuff - = new StuffEventHandler (this.Handle);" код удаления не сравнивает делегата, которого вы удаляете по ссылке: он проверяет равенство, сравнивая ссылки на целевой метод (ы), который вызовет делегат, и удаляет соответствующие делегаты из "OnStuff".

Кстати, «OnStuff» сам по себе является объектом делегата (ключевое слово события, которое, как я полагаю, содержится в вашем объявлении, просто ограничивает доступ делегата).

2 голосов
/ 19 сентября 2008

У меня сложилось впечатление, что 2 - это просто синтаксис сахара. Они должны быть точно то же самое.

1 голос
/ 19 сентября 2008

Если я правильно помню, первая альтернатива - просто синтаксический сахар для второй.

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