2012-12-22 37 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以獲取有關該主題的更多信息)。