【編程思想】C# delegate 委托的本質(zhì):方法對象的應(yīng)用
一、前言
翻回之前寫的博客,前期寫的結(jié)構(gòu)確實差很多,
這次細(xì)看了《委托那些事(一)、(二)》,忍不住重新寫一下,之前把簡單的事情復(fù)雜化了。
為什么現(xiàn)在思維不一樣了,有一點我認(rèn)為是見識的計算機(jī)語言多了,會比較語法:為什么它要這么設(shè)計。
二、委托的本質(zhì)
首先有一點,萬物皆對象,方法也是對象。
C# 方法的類型是: Func(執(zhí)行有返回參數(shù))或者 Action(執(zhí)行無返回)。
委托(delegate)
就是語法,包裝這么一個事情:
當(dāng)需要實現(xiàn)執(zhí)行對象A的a方法時,就觸發(fā)執(zhí)行方法b、c、d..,并且方法b、c、d..可以按需定義。
注:delegate關(guān)鍵詞的用法,見鏈接
這個關(guān)鍵詞存在就是增加語法復(fù)雜度,C#語法糖升級,可以使用類型Func或Action,這比delegate更清爽。
事件(event)
方法b、c、d..的容器,可以往里放方法對象,也可以拿出來。
訂閱(event += 方法)
往方法容器(event)里面放入方法對象,這個動作叫做訂閱。event 類型支持 += 方法 的用法。
退訂/取消訂閱(event -= 方法)
往方法容器(event)里面移出方法對象,這個動作是取消訂閱,也即退訂。event 類型支持 -= 方法 的用法。
三、示例代碼
public delegate void OrderEventHandler(Customer cus, OrderEventArgs e); // 后綴EventHandler 是習(xí)慣命名 public class OrderEventArgs : EventArgs // 習(xí)慣把xxEventArgs 繼承于C#自帶的EventArgs { public string DishName { get; set;} public string Size { get; set;} } public class Customer { private OrderEventHandler orderEventHandler; public event OrderEventHandler Order { // 容器只接受OrderEventHandler 的方法簽名 add { this.orderEventHandler += value;} // 和get、set一樣的,換了個名字 remove { this.orderEventHandler -= value;} } public void ThinkForOrder () // 顧客下單 { if (this.orderEventHandler != null ) // 容器里面存在方法時,就不為空 { // invoke(xxA, xxB) 即執(zhí)行容器內(nèi)的所有方法,xxA、xxB類型由OrderEventHandler 指定 this.orderEventHandler.Invoke(this, new orderEventArgs{ 。。}); } } }
遙想起,初學(xué)delegate的時候,看代碼看得很痛苦,覺得很繞,現(xiàn)在看來……
就這 ?

浙公網(wǎng)安備 33010602011771號