Удобство - важная вещь, тем более что C # не имеет внутренних классов Java; поскольку это будет интерфейс с одним методом, это позволяет выполнять тривиальную подписку - возможно, с помощью метода типа, но, возможно, даже встроенного:
pub.RaiseCustomEvent += delegate { DoSomething(); };
Выше также учитывается полный лексический захват любых переменных и т. Д. (В отличие от Java, который фиксирует значения любых переменных, а не самих переменных, поэтому возможна двусторонняя связь).
Чтобы сделать это с помощью интерфейса, мне нужно было бы объявить новый класс, реализовать интерфейс, предоставить метод для обеспечения реализации и обработать любую передачу переменной / захвата.
События также позволяют транслировать нескольким абонентам очень удобным способом.
Делегатов также легче создавать во время выполнения (для метапрограммирования и т. Д.), Чем для классов - например, я могу создать делегата (с нуля) во время выполнения и подписаться на него довольно легко, используя либо DynamicMethod
(если мне интересно IL) или Expression
(если мне нравится AST). Создать тип и реализовать интерфейс - это немного больше работы (AssemblyName
, AssemblyBuilder
, ModuleBuilder
, TypeBuilder
и, по крайней мере, 2 Type
с и MethodInfo
с).