Должен ли делегат быть объявлен внутри класса, который приведет к событию или вне его?
Я видел различные примеры обработки событий. Вот один из них: Пример события.
Иногда я вижу делегата, объявленного вне класса, который поднимет событие (как в ссылке выше), а иногда и внутри (где я думаю, что он должен быть объявлен).
Мне больше смысла объявлять событие внутри класса, которое поднимет это событие. Причина в том, что событие, объявленное классом, на самом деле является лишь некоторым покрытием сахара для вспомогательных методов и т.д., Которые действительно выполняют добавление, вычитание и вызов делегата и т.д.
Есть ли лучшие практики? Могут ли времена, когда вы хотите объявить делегата за пределами, и в другие моменты, когда вы хотите объявить делегата внутри? Если да, то как следует решить, что делать?
Ответы
Ответ 1
Как правило, в эти дни вы должны создать свой собственный класс, полученный из EventArgs
, а затем просто используйте EventHandler<TEventArgs>
- нет необходимости для создания отдельного типа делегата. Поэтому вместо AlarmEventHandler
используйте EventHandler<AlarmEventArgs>
. Класс EventArgs
-derived должен, как правило, быть на верхнем уровне (т.е. Не вложенным).
Ответ 2
Я бы объявил их снаружи, поскольку они предназначены для использования другими классами - потребителями события. Я бы сохранил делегат в том же файле, что и класс, если делегат определен для этого класса.
Это меньше проблем, если вы используете общую версию EventHandler<TEventAgrs>
, доступную в .NET 2.0 и новее, так как вам нужно объявить только свой пользовательский EventArgs
.
Ответ 3
Если я правильно помню, в CLR (классы/структуры/делегаты/перечисления) есть несколько примеров общедоступных вложенных "объектов". Поэтому делегаты обычно являются "внешними" для класса.
НО, начиная с .NET 3.5, появилась идея использовать "общие" делегаты (Func<T>
, Action<T>
, Predicate<T>
) вместо постоянно растущего числа несовместимых делегатов