簡體   English   中英

如何與委托一起使用事件

[英]How to use an event with a delegate

據我所知,關於委托的唯一事情是,委托是:

  • 指向方法的指針。

  • 它可以一次調用多個方法。

但是我無法理解的是,有些用戶正在使用事件處理程序委托來聲明事件。 例如:

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

但是我不知道委托的事件處理程序有什么事件。 有人可以向我解釋一下這次活動嗎? 我可以在哪里使用它,如果eventhandler是委托的名稱,這意味着什么?

花一些時間閱讀這篇介紹代理及其與事件關系的文章 我相信它是由著名的Jon Skeet撰寫的。

您將一些委托分配給EventOfDelegate(如您在代碼中聲明的那樣)。 示例EventOfDelegate+= new MyDelegate(arg);

arg是調用事件get時要執行的操作。

然后,當我們想使用該事件時,

if (EventOfDelegate != null) // check if we assigned it
    EventOfDelegate(arg);
public delegate void MyDelegate(string Name);

此行聲明的委托具有空返回類型和一個字符串類型的單個輸入參數。 然后在以下事件聲明中使用它,這基本上意味着該事件的訂閱者必須具有與委托定義中先前定義的相同的簽名(或多或少,請在此處閱讀有關該主題的更多信息)。

正如您在@Oded發表的問題中所看到的:

事件聲明在委托實例上添加了一層抽象和保護。 此保護可防止委托的客戶端重置委托及其調用列表,並且僅允許在調用列表中添加或刪除目標。

這是必需的,因為使用委托和事件會出現兩個角色: 廣播者訂戶

摘自“ C#4簡而言之 ”一書:

廣播者是一種包含委托字段的類型。 廣播公司通過調用代表來決定何時廣播。

訂閱者是方法目標接收者。 訂戶通過調用廣播代理的+ =和-=來決定何時開始和停止收聽。 一個訂戶不了解或干擾其他訂戶。

然后,事件是用於暴露此模型(訂戶/廣播模型)所需的委托功能的構造。 事件的主要目的是防止訂戶相互干擾。 例如:

考慮一個朋友和你自己。 您與朋友簽署協議。 該協議包括:

  • 完成活動后,您的朋友必須通知其他朋友您的活動結束。 那些朋友必須做其他活動。

在這種情況下,您是廣播公司 ,您的朋友是訂戶 ,您的活動結束是活動 代表呢? 代表是您的朋友,因為他必須向其他朋友發送有關您活動結束的消息,以便他們進行其他活動。

換句話說:

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每一次事件的PriceStock變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM