【问题标题】:How to use an event with a delegate如何通过委托使用事件
【发布时间】:2014-07-03 03:13:15
【问题描述】:

据我所知,关于委托的唯一信息是,委托是:

  • 指向方法的指针。

  • 而且可以同时调用多个方法。

但我无法理解的是,一些用户正在使用委托的事件处理程序声明一个事件。 例如:

public void delegate MyDelegate(string Name);
public event MyDelegate EventOfDelegate;

但我不知道委托的事件处理程序的事件是什么。有人可以向我解释一下这个事件是怎么回事吗?我可以在哪里使用它,如果事件处理程序是委托的名称,这意味着什么?

【问题讨论】:

标签: c# events delegates


【解决方案1】:

花点时间阅读this article,它描述了委托及其与事件的关系。我相信它是由著名的Jon Skeet 写的。

【讨论】:

    【解决方案2】:

    您可以在@Oded 发布的question 中看到:

    一个事件声明在事件上增加了一层抽象和保护 委托实例。这种保护可以防止委托的客户 从重置委托及其调用列表,并且只允许 在调用列表中添加或删除目标。

    这是必需的,因为使用委托和事件会出现两个角色:广播者订阅者

    来自“C# 4 in a Nutshell”一书:

    广播器是一种包含委托字段的类型。这 广播者通过调用委托来决定何时广播。

    订阅者是方法目标的接收者。订户决定 何时开始和停止收听,通过调用 += 和 -= 广播公司的代表。订户不知道或不干涉 与其他订阅者。

    然后,事件是一种构造,用于公开此模型(订阅者/广播者模型)所需的委托功能。事件的主要目的是防止订阅者相互干扰。 例如:

    考虑一个朋友和你自己。你和你的朋友签署了一份协议。本协议包括:

    • 当你完成一项活动后,你的朋友必须通知 其他朋友关于你活动的结束。那些朋友不得不 做其他活动。

    在这种情况下,您是广播员,您的朋友是订阅者,您的活动结束是事件。代表呢? 代表是您的朋友,因为他必须将您活动结束的消息告诉其他朋友,以便让他们进行其他活动。

    换句话说:

    public delegate void PriceChangedHandler(decimal oldPrice, decimal newPrice);
    
    public class Stock
    {
        string symbol;
        decimal price;
    
        public Stock(string symbol) { this.symbol = symbol; }
    
        public event PriceChangedHandler PriceChanged;
    
        public decimal Price
        {
            get {return Price;}
            set
            {
                if(price == value) return;
                if(PriceChanged != null) /* if invocation list is not empty, fire the event */
                    PriceChanged(price, value);
                price = value;
            }
        }
    

    您可以看到,每当Stock 中的Price 发生变化时,Stock 类都会触发其PriceChanged 事件。

    【讨论】:

    • 我非常了解这一点。但是当你在事件中传递价格和价值时:PriceChanged(price,value);委托将包含这些值?
    • @Leo 是的,委托 PriceChangedHandler 将接收这些值,这些值将传递给委托中的某些方法,例如在这些 examples 中。
    【解决方案3】:

    您将一些委托分配给 EventOfDelegate(正如您在代码中声明的那样)。示例EventOfDelegate+= new MyDelegate(arg);

    其中 arg 是调用事件 get 时要执行的操作。

    然后当我们想要使用该事件时,我们会这样做

    if (EventOfDelegate != null) // check if we assigned it
        EventOfDelegate(arg);
    

    【讨论】:

      【解决方案4】:
      public delegate void MyDelegate(string Name);
      

      这一行声明了一个具有 void 返回类型和一个字符串类型的输入参数的委托。然后在以下事件声明中使用它,这基本上意味着此事件的订阅者必须具有先前在委托定义中定义的相同签名(或多或少,请阅读 here 以获取有关该主题的更多信息)。

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多