Должен ли делегат быть объявлен внутри класса, который будет вызывать событие, или снаружи? - PullRequest
14 голосов
/ 13 марта 2011

Я видел различные примеры обработки событий. Вот один из них: Пример события .

Иногда я вижу делегата, объявленного вне класса, который вызовет событие (как в ссылке выше), а иногда внутри (где I думает, что оно должно быть объявлено).

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

Есть ли лучшие практики? Есть ли случаи, когда вы хотели бы объявить делегата снаружи, и в других случаях, когда вы хотели бы объявить делегата внутри? Если да, то как решить, что делать?

Ответы [ 3 ]

19 голосов
/ 13 марта 2011

Как правило, в наши дни вы создаете свой собственный класс, полученный из EventArgs, а затем просто используете EventHandler<TEventArgs> - нет необходимости создавать отдельный тип делегата.Поэтому вместо AlarmEventHandler вы бы использовали EventHandler<AlarmEventArgs>.* * * * * * * * * * * *. Полученный класс * обычно должен быть верхнего уровня (т.е. не вложенным).

6 голосов
/ 13 марта 2011

Я бы объявил их снаружи, поскольку они предназначены для использования другими классами - потребителями события. Я бы оставил делегата в том же файле, что и класс, если делегат специфичен для этого класса.

Это не проблема, если вы используете универсальную версию EventHandler<TEventAgrs>, доступную в .NET 2.0 и новее, так как вам нужно объявить только свой пользовательский EventArgs.

2 голосов
/ 13 марта 2011

Если я правильно помню, в CLR есть несколько примеров общедоступных вложенных "объектов" (классы / структуры / делегаты / перечисления). Таким образом, делегаты обычно являются «внешними» по отношению к классу.

НО начиная с .NET 3.5 появилась идея использовать «универсальные» делегаты (Func<T>, Action<T>, Predicate<T>) вместо постоянно растущего числа несовместимых делегатов

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