publisher.MyEvent += subscriber.SomeMethod;
В приведенной выше строке правое выражение «subscriber.SomeMethod» имеет тип GenericEventHandler (S sender, A args).
Так же, как объекты являются экземплярами типов классов, методы являются экземплярами типов делегатов.
Класс определяет шаблон для объекта ... делегат определяет сигнатуру для метода ...., который является параметром и возвращаемым типом. Переменная типа делегата - это просто ссылка на один из нескольких методов, сигнатура которых соответствует сигнатуре, указанной в объявлении делегата.
В старых версиях C # вам нужно написать что-то вроде следующего:
publisher.MyEvent +=
new GenericEventHandler<MyPublisher,EventArgs>(subscriber.SomeMethod);
В более новых версиях C # тип этого длинного уродливого выражения с правой стороны автоматически определяется, когда вы просто предоставляете subscriber.SomeMethod. И это определяется подписью SomeMethod, а также типом MyEvent ... который является делегатом, определяющим подпись.
Если код в SomeMethod действительно тривиален, и вы не будете вызывать его из какого-либо другого места в программе, вы можете полностью избежать написания его в именованном методе (например, SomeMethod) и вместо этого использовать синтаксис анонимного метода как следующий и написать тут же:
publisher.MyEvent += delegate(MyPublisher s, EventArgs a)
{
/* the SomeMethod Code */
};
Или, что еще лучше, используйте лямбда-выражения, подобные следующим:
publisher.MyEvent += (s, a) => {/*the SomeMethod code*/};
В вышеприведенном лямбда-выражении типы параметров 's' и 'a' автоматически выводятся из типа MyEvent. ... который, конечно, делегат, указывающий подпись.
Теперь каждый раз, когда MyEvent запускает код в анонимном методе или лямбда-выражение будет выполняться.