将正常订阅者方法添加到事件和匿名事件处理程序之间的区别是什么?

时间:2017-03-10 16:07:19

标签: c# events delegates

我很难理解为什么附加一个正常的'作为发布者事件的订阅者的方法,以及代理人。

例如......

public class Caller
{
    public string Name { get; set; }
    public event EventHandler<RuedaEventArgs> MakeRuedaCall;

    public virtual void OnMakeRuedaCall(RuedaEventArgs args) {
        if (MakeRuedaCall != null) {
            MakeRuedaCall(this, args);
        }
    }
}

这是我定义和举起活动的发布商类。我也在使用一些自定义事件参数。

public class Salsera {
    public Salsera(Caller caller) {
        caller.MakeRuedaCall += MakeMovement;
    }
    public void MakeMovement(object source, RuedaEventArgs args) {
        if (args.CallName == "Vacilala") {
            Turn();
        }
        if (args.CallName == "Patin") {
            MoveToOutside();
        }
    }
    private void MoveToOutside() {
        Console.WriteLine("Ladies move to the outside....");
    }
    private void Turn() {
        Console.WriteLine("Ladies turn....");
    }
}

这是一个类,我在构造函数中添加一个方法作为订阅者。

假设我在其他地方......

Caller matt = new Caller();

EventHandler<RuedaEventArgs> anonyMouseFunc = (sender, eventArgs) =>
{
    switch (eventArgs.CallName) {
        case "Patin":
            Console.WriteLine("Adding a new subscriber for Patin");
            break;
        case "Vacilala":
            Console.WriteLine("Adding a new subscriber for Vacilala");
            break;
    }
};
matt.MakeRuedaCall += anonyMouseFunc;

很抱歉,如果这看起来像一个愚蠢的问题,但为什么你可以订阅一个正常的&#39;方法(假设它与委托签名相匹配)到一个事件,还有一个匿名方法作为事件的委托。

即。 public event EventHandler<RuedaEventArgs> MakeRuedaCall;如何处理这两个选项?

非常感谢,

1 个答案:

答案 0 :(得分:2)

  

很抱歉,如果这看起来像是一个愚蠢的问题,但为什么你可以订阅一个'正常'方法(假设它与委托签名相匹配)到一个事件,还有一个匿名方法作为一个事件的委托。

在这两种情况下,您都在订阅代理人。在这种情况下:

caller.MakeRuedaCall += MakeMovement;

...您正在使用方法组转换MakeMovement(这是规范术语中的方法组)转换为委托实例。该代码(几乎完全)等同于:

caller.MakeRuedaCall += new EventHandler<RuedaEventArgs>(MakeMovement);

或者以另一种方式来思考,它相当于:

EventHandler<RuedaEventArgs> handler = MakeMovement;
caller.MakeRuedaCall += handler;

这种从常规方法创建委托的能力当然不仅仅适用于事件处理 - 您可以将它用于LINQ以及您使用委托的任何其他地方。