order是事件,這種invoke就是無法在外部實現的,事件的觸發只能由事件的擁有者自己來做。
——需要強調的是,簡化宣告時invoke可以在類體內被呼叫——這是一種不得已而為之的語法:因為簡化宣告時沒有手動宣告乙個委託型別的字段來作為約束器供類體內呼叫。
事件的相關命名規則整合及總結
1>.用於約束和宣告事件hungry的委託,一般命名為hungryhandler(除非是某些非常通用的事件約束器)
2>.hungryeventhandler委託一般有兩個引數(由win 32 api演化而來,歷史非常悠久)
·第乙個引數是obejct型別的例項sender,規定了事件傳送者是誰,也規定了處理器 響應誰的事件;任何訊息的傳送者都肯定是個物件,而所有物件都是object的子類實 例
· 第二個引數是eventargs的派生類的例項e,這個派生類的類名一般是hungryeventargs,引數名為e,又稱事件引數;這個事件引數實際上就是事件傳送者傳送給響應者的「事件訊息」,響應者根據這個事件訊息來處理事件。(事件引數e所包含的資料是事件處理器加工件所用的引數)——函式是資料的加工廠!
3>.觸發hungry事件的方法一般命名為onhungry,即「因何而發」,「事出有因」:因為我這個事件被觸發了,所以這個方法被呼叫了
·這個onhungry的訪問級別是protectd,不能為public,不然又能「借刀殺人」了。
protected修飾的物件只能從當前類或當前類的派生類訪問。
4>.因為單一職責原則,onhungry方法一般只用於觸發事件,類似上面例子裡的think方法又負責思考又負責呼叫事件(這個方法做了兩件事)的寫法是不規範的。
可以修改為:
public void think()
//如果例項order事件的約束器不為空就呼叫事件
if (this.ordereventhandler != null)
}protected void onorder(dishtype dishtype,string dishname)
5>.在觸發事件時要先判斷事件處理器是否為空
6>.在命名事件時使用帶有時態的動詞或者動詞短語
·事件擁有者「正在做」什麼事就用進行時,「做完了」什麼事就用完成時
事件與委託的關係及謬誤辨析
事件是「以特殊方式宣告的委託字段/例項嗎?」
不是!只是宣告時看起來有點像而已
·事件的宣告使用委託型別來約束,簡化宣告使事件看起來就像乙個委託的字段(例項),而event關鍵字則像是乙個修飾符,這是錯覺的**之一
訪問修飾符 event 約束器型別 事件名;
這裡的「約束器型別」正是委託的型別
·訂閱事件時的+=操作符後面可以是乙個委託的例項,這與委託例項的賦值方法語法相同,也讓事件看起來像乙個委託字段——這是錯覺的另乙個**
(+=既可以用於給事件掛載處理器,也可以給委託用來掛載委託所要「託管」的方法,這裡的託管是呼叫的意思)
強調:事件的本質是委託上的乙個蒙版[mask],是用於隱蔽委託功能的包裝器,這個用於阻擋非法訪問的mask絕不是委託字段本身。
為什麼要以委託型別來宣告事件?
·站在source角度來看,是為了表明source所能對外傳遞的資訊
·站在subscirber[訂閱者]角度看,這個委託是一種約定,用於約束能使用什麼樣簽名的方法來處理(響應)事件
·委託型別的例項用於儲存(引用)事件的處理器
對比事件和屬性
·屬性不是字段——很多時候屬性是字段的包裝器,這個包裝器保護欄位不被濫用
·屬性不是委託字段——它是委託欄位的包裝器,這個包裝器用來保護委託欄位不被濫用
·包裝器永遠不可能是被包裝的東西
正則知識點補充
1.與正規表示式有關的字串物件的方法 string.replace pattern,string 替換在正規表示式查詢中找到的文字。string.search pattern 通過正規表示式查詢相應的字串,只是判斷有無匹配的字串。如果查詢成功,search 返回匹配串的位置,否則返回 1。strin...
property知識點補充
1 synthesize和 dynamic作用 1 property有兩個對應的詞,乙個是 synthesize,乙個是 dynamic。如果 synthesize和 dynamic都沒寫,那麼預設的就是 syntheszie var var 2 synthesize的語義是如果你沒有手動實現set...
DOM知識點補充
一 元素物件的屬性及自定義屬性的設定或獲取?物件.屬性 物件 屬性 物件.getattribute 屬性名 物件.setattribute 屬性名 屬性值 物件.removeattribute 屬性名 二 outerhtml 獲取當前元素物件及所有內容 innerhtml 設定或獲取當前元素物件內的...