C 基礎 委託那些事兒(二)

2022-03-14 08:02:36 字數 1976 閱讀 6762

二、傳統的委託

接下來講一講方法引數。下面以「餐館服務員為客戶下單」[2]的事件作為描述。一般對事件的做法分3個部分:

1. 方法引數 eventargs,一般用於傳送資料。在本例場景中

public

delegate

void

ordereventhandler(customer cus, ordereventargs e);

public

class ordereventargs : eventargs //

習慣把xxeventargs 繼承於c#自帶的eventargs

//菜名public

string size //

份量}

2 . 觸發事件的物件

// 下單的事件是customer物件擁有的,∴寫在customer類當中

public

class

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...