委託提供與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...