二、傳統的委託
接下來講一講方法引數。下面以「餐館服務員為客戶下單」[2]的事件作為描述。一般對事件的做法分3個部分:
1. 方法引數 eventargs,一般用於傳送資料。在本例場景中
publicdelegate
void
ordereventhandler(customer cus, ordereventargs e);
public
class ordereventargs : eventargs //
習慣把xxeventargs 繼承於c#自帶的eventargs
//菜名public
string size //
份量}
2 . 觸發事件的物件
// 下單的事件是customer物件擁有的,∴寫在customer類當中
publicclass
customer
//add是事件處理器的新增器
remove
}public
void thinkfororder () //
顧客下單
;
this.ordereventhandler.invoke(this, e); //
this指此類例項化的customer
} }
}
3 . 執行的方法
在主函式中,為customer物件的order事件訂閱waiter.action,客戶的下單,需要由服務員行動。
cus.order += waiter.action;
即有:public class waiter
}總結上文:
main
customer cus = new customer();
waiter wai = new waiter();
cus.order += wai.action;
cus.thinkfororder();
console.writeline("the customer will pay .", cus.billprice);
customer
事件物件對eventhandler方法類的訂閱
waiter
public class waiter
." , customer.name, e.dishname);
customer.bill += e.price;
}三、小結
如果把事件寫成委託型字段的話:
- 假設有一客人badguy,並且badguy.order += waiter.action;,那麼如果badguy.order.invoke(),即會破壞引數e,或者引數customer。
例如,badguy不給自己點菜,點到了customera上,badguy.order.invoke(customera, e2);
事件:- 使邏輯、物件關係更加安全,防止「借刀殺人」。
- 只能寫在+=或-=的左邊。避免了委託被直接invoke呼叫。
(委託字段可能在public當中被濫用,所以微軟推出event這種成員。)
- 本質:委託欄位的包裝器;
對委託欄位的訪問僅起限制作用,僅暴露add、remove事件處理器的功能。
- 引數:乙個表示傳送者,e表示傳送的訊息/資料/內容
- 規定:事件觸發必須由事件foo擁有者自己去傳送資訊。
觸發事件的方法一般命名為:onfoo,意為事出有因。
注意:onfoo的訪問級別一定是protected,若為public又可「借刀殺人」了。
首尾呼應:
屬性不是字段——很多時候,屬性是字段的包裝器,保護欄位不被濫用。包裝器永遠不可能是包裝的東西。
注釋:[1] 自《深入理解c#》(第3版)jon skeet 著 姚琪琳 譯
C語言那些事兒
專案名稱 蘇嵌實訓 嵌入式linuxc第3天 今日進度以及任務 學習了c語言的基本知識 本日任務完成情況 掌握了c語言的基本知識 本日開發 現的問題彙總 c語言中的細節問題要注意 本日未解決的問題 無本日開發收穫 進一步熟悉了c語言其他無 c語言1 c語言之父?丹尼斯里奇 2 c的特點 優勢 語言標...
c 關於ctime那些事兒
c 的標準庫沒用給具體時間日期的函式,而是用了c中的時間日期的函式,比如說之前提到的那個c 隨機點名軟體,就用到了ctime中的隨機數種子。include include using namespace std intmain tm是格式化時間的操作,我們看到的大多數時間函式,都會用到tm結構,下面...
C 委託基礎1 委託基礎
委託和其委託的方法必須具有相同的簽名。簽名相同 1.引數型別相同 2.引數數量相同 3.返回值一致 例一 class program static void main string args mm 7,6 console.readline 例二 class program double subtra...