1

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

  • 指向方法的指针。

  • 它可以一次调用多个方法。

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

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

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

4

4 回答 4

1

花一些时间阅读这篇描述委托及其与事件的关系的文章。我相信它是由著名的Jon Skeet写的。

于 2012-12-22T20:15:00.260 回答
0

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

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

然后,当我们想使用该事件时,我们会

if (EventOfDelegate != null) // check if we assigned it
    EventOfDelegate(arg);
于 2012-12-22T20:06:00.813 回答
0
public delegate void MyDelegate(string Name);

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

于 2012-12-22T20:18:25.880 回答
0

正如您在@Oded 发布的问题中看到的那样:

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

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

从“ 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该类都会触发其事件。PriceChangedPriceStock

于 2012-12-22T20:26:47.847 回答