Должен ли делегат быть объявлен внутри класса, который приведет к событию или вне его?

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

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

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

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

Ответы

Ответ 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>) вместо постоянно растущего числа несовместимых делегатов