2012-12-22 42 views
1

使用事件据我了解代表的唯一的事情就是,代表是:如何使用委托

  • 指向一个方法。

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

但我不明白的是,有些用户正在用eventhandler委托来声明一个事件。 例如:

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

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

+0

相关:http://stackoverflow.com/questions/29155/what-are-the-differences-between-delegates-and-events – Oded

+0

可能的重复[为什么事件需要委托?为什么我们甚至需要事件?](http://stackoverflow.com/questions/10775540/why-do-events-need-delegates-why-do-we-even-need-events) –

回答

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每类的Stock变化Price时间触发其PriceChanged事件。

+0

我真的很接近理解这一点。但是当您通过价格和事件中的价值时:PriceChanged(price,value);代表将包含这些值? – Leo

+0

@Leo是的,代理PriceChangedHandler将接收这些值,这些值将传递给委托内的某些方法,如在这些[示例]中(http://msdn.microsoft.com/en-us/library/ms173172%28v = VS.80%29.aspx)。 –

0

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

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

然后,当我们要使用该事件,我们做

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

花一些时间来阅读this article描述代表和他们的活动的关系。我相信它是由着名的Jon Skeet写的。

0
public delegate void MyDelegate(string Name); 

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