C 基礎 理解 簡述委託與事件的區別

2021-09-13 13:53:14 字數 2387 閱讀 2939

委託提供與c++中「函式指標」相同的功能,用於傳遞和呼叫函式的引用,是觀察者模式的一種實現。

事件是用委託實現的,是對委託的額外封裝,其本質上是一種特殊的委託。

本篇使用分別使用委託和事件來實現簡單的觀察者模式例子,三個版本輸出完全相同,為方便對比,使用了最原始的delegate語法。讀者可以對比三版的不同之處來了解兩者的區別。

using system;

namespace learningdelegate

}//讀者

class observer

public string name;

public void recievemagazine(string message)

收到了, 仔細閱讀了一番。", this.name, message);}}

//出版社

class publisher

public string magazinename;

public delegate void magazinedelegate(string message);

public magazinedelegate magazine;

public void publishingmagazine()}}

}

委託有乙個特點:由於委託的訂閱和觸發都直接作用於delegate物件,這導致委託可以在可訂閱的空間中被觸發,也就是說我們無法將委託的觸發封裝起來。而事件event物件只能在其定義的類中被觸發。

using system;

namespace learningdelegate

}//讀者

class observer

public string name;

public void recievemagazine(string message)

收到了, 仔細閱讀了一番。", this.name, message);}}

//出版社

class publisher

public string magazinename;

public delegate void magazinedelegate(string message);

//使用自定義的委託型別和event關鍵字建立事件物件

public event magazinedelegate magazine;

public void publishingmagazine()}}

}

這個最最簡單的事件,就是給原有的委託加了一層event關鍵字的封裝,增加了上述的兩個特性。這個簡單的例子只能用於了解委託和事件語法的差別,下面給出標準的事件語法的版本。

using system;

namespace learningdelegate

}//讀者

class observer

public string name;

//接受資訊的函式要與event的格式保持一致,輸入乙個object物件和event訊息類

public void recievemagazine(object sender, publisher.magazinemessage magazinemessage)

收到了, 仔細閱讀了一番。", this.name, magazinemessage.message);}}

//出版社

class publisher

private string message;

public string message

}public publisher(string megname)

public string magazinename;

//定義event

public event eventhandlermagazine;

//eventhandler的原型是乙個泛型委託:delegate void eventhandler(object sender, teventargs e)

//呼叫event,event只能在自己定義類中被觸發呼叫

public void publishingmagazine()}}

}

由上可知,從語法上,我們可以使用event關鍵字將任意委託轉化為事件。那麼簡而言之,出於**健壯性考慮,如果乙個委託不需要在其定義的類之外進行觸發,那就將其轉化為事件,保證它不會在不可知的情況下被觸發。

更為深層的關於委託和事件的理解,請看下列參考資料。

參考資料

《c#本質論》

c# 事件**

大白話系列之c#委託與事件講解 系列

C 委託與事件的區別

事件是利用委託來申明的,因此先解釋委託。委託是乙個類,它與其他類如int,string等沒有本質區別,int代表的是所有的整形,而string代表的是字串,委託則代表的是一類方法,這類方法具有相同返回型別和相同引數。委託的定義 public delegate void calculatorhandl...

委託與事件的區別

用乙個公司的場景來說明。假如你是乙個公司的老闆,手下有兩名員工 有點少,呵呵 小張和小王。你給了小王乙個這樣的特權 如果小張玩遊戲,你就可以扣小王500元錢。這就是現實中的委託。在寫程式中,程式設計師就是老闆,小張和小王就是兩個物件。小張玩遊戲是乙個方法,小張還有乙個遊戲事件,他玩遊戲激發這個事件。...

委託與事件的區別

使用事件的 定義乙個類 class foo 定義乙個方法,呼叫委託 public void action class program 使用委託的方法 class foo 執行乙個方法方法 public void action class program 區別一 event可以多播 class foo...