如何使用委托事件

时间:2012-12-22 19:38:39

标签: c# events delegates

据我所知,关于代表的唯一事情是,委托是:

  • 指向方法的指针。

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

但我无法理解的是,有些用户正在使用eventhandler声明一个事件代理。 例如:

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

但我不知道委托的eventhandler事件是什么。有人可以向我解释这次活动的内容吗?在哪里我可以使用它,如果eventhandler是委托的名称是什么意思?

4 个答案:

答案 0 :(得分:1)

花些时间阅读描述代表及其与事件关系的this article。我相信它是由着名的Jon Skeet写的。

答案 1 :(得分:0)

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

当arg是调用event get时要执行的操作。

然后当我们想要使用那个事件时

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

答案 2 :(得分:0)

public delegate void MyDelegate(string Name);

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

答案 3 :(得分:0)

正如您在@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 PriceChanged更改时,您都可以看到Price类触发其Stock个事件。