Можем ли мы представить себе в C # написание наших собственных событий без написания делегатов? - PullRequest
5 голосов
/ 30 октября 2009

Я изучил объектно-ориентированный язык в Java. Сейчас в разработке в C #. Это означает, что я никогда не понимал функционирование делагатов, но я знаю, как их использовать.

В последнее время я обнаружил эту страницу http://java.sun.com/docs/white/delegates.html.

Если Java может создавать события без делагетов, возможно ли сделать то же самое в C #? Можем ли мы представить, что пишем свои собственные события без единого делегата?

(вопрос уже задан на французском здесь )

Ответы [ 5 ]

8 голосов
/ 30 октября 2009

Да, вы можете использовать интерфейс с одним методом вместо делегата. Вам также понадобится реализация многоадресной природы делегатов, как с точки зрения добавления / удаления, так и вызова. Однако было бы сложно иметь класс single , реализующий многоадресную передачу, а также реализовывать Invoke безопасным для типов образом, поскольку интерфейсы имеют разные числа и типы параметров. Конечно, их может быть несколько: Multicast<T>, Multicast<T1, T2> и т. Д. (Вероятно, тот же класс будет обрабатывать и асинхронное выполнение.)

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

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

7 голосов
/ 30 октября 2009

Нет, вы не можете делать события в C # без делегатов. В C # события определяются как делегаты:

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

Однако вы можете имитировать события, используя шаблон Observer .

Ответ Microsoft на Белую книгу Sun стоит прочитать.

1 голос
/ 30 октября 2009

Это довольно старый документ и посмотрите, где он их получил. Вы можете сделать то же самое в .NET, если хотите. Все, что делает «Java Way», - это использование наследования. Это хорошо, но для многих семантика "указатель на функцию" намного проще и менее многословна.

0 голосов
/ 30 октября 2009

С какой стати вы хотите это сделать? Я имею в виду, что если у вас есть механизм правил или команды, которые являются чем-то большим, чем просто обработчики событий, то убедитесь: вы захотите реализовать интерфейс, потому что у вас будет состояние и поведение помимо фактического фрагмента кода, который вы хотите запустить.

Но если предоставить некоторый код для запуска при возникновении события, то нет причин не использовать делегатов.

Делегаты - это тонкие абстракции над указателями методов / функций, и поэтому они добавляют очень мало накладных расходов. И ИМО, не стоит добавлять накладные расходы только ради этого.

0 голосов
/ 30 октября 2009

Да, вы можете. Вы можете использовать предопределенные делегаты. (Я не уверен, какой у вас уровень опыта и о чем вы действительно спрашиваете)

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