讀 總結 11 詳談事件

2021-09-08 21:47:42 字數 2023 閱讀 8003

什麼是事件?

事件是類的一種成員。如果型別定義了事件,那麼它就可以通知其它物件發生了特定的事情(比如button的click事件)。事件是實現這種互動的型別成員。

事件是建立在委託的基礎之上,事件是被封裝的委託。

理解這幅圖對於理解事件的原理非常重要:

1,發布者類訂義了事件成員。

2,訂閱者類註冊在事件成員被觸發時要呼叫的方法(事件處理程式)。

3,當發布者觸發事件時,所有列表中的事件處理程式都會被呼叫。  

這是乙個電子郵件到達通知的例子,當電子郵件到達時,會引發newmail事件,而註冊到這個事件上的fax和pager都會收到通知,並以自己的方式處理該郵件。

**如下:

namespace

eventdemo2

}//發布者類

internal

class

mailmanager

}//3,觸發事件2-將輸入轉化為期望事件

public

void simulatenewmail(string

from, string to, string

subject)

}//自定義類,通過擴充套件eventargs來傳遞資料

//這裡容納傳送給事件接受者的資訊

internal

class

newmaileventargs : eventargs

public

string

from

}public

string

to

}public

string

subject}}

//訂閱者類1

internal

class

fax

public

void

unregister(mailmanager mm)

private

void faxmsg(object sender, newmaileventargs e)//

注意:處理程式的返回型別和簽名必須和事件委託的返回型別和簽名一致

, to=, subject=

",e.from,e.to,e.subject);}}

//訂閱者類2

internal

class

pager

public

void

unregister(mailmanager mm)

private

void pagermsg(object

sender, newmaileventargs e)

, to=, subject=

", e.from, e.to, e.subject);}}

}

程式輸出結果如下圖所示。

注意事項:1,+=和-=是事件中唯一允許使用的運算子,分別代表註冊事件處理程式和取消註冊事件處理程式。

2,不要誤認為事件是型別,事件是型別的一種成員,所以它也不可以使用物件建立表示式(new表示式)來建立它的物件。

3,呼叫事件與呼叫委託相似(與呼叫方法也相似),但是要注意它的引數必須要與事件的委託匹配。

4,訂閱事件(註冊事件處理程式)有多種方法,可以是例項方法,靜態方法,匿名方法,或lambda表示式。最常見的是使用委託形式的例項方法。如:

btn.click+=new eventhandler(btn_click);//等價於:btn.click+=btn_click;

5,eventhandler委託的第二個引數eventargs預設是不能傳遞任何資料的,如果希望被設計成能傳遞資料,必須自定義乙個從eventargs繼承的類,並使用私有欄位來儲存需要被傳遞的資料。

讀 總結 6 詳談例項構造器和型別構造器

例項構造器是允許將型別的例項初始化為良好狀態的一種特殊方法,它在類的每個新例項建立的時候執行。如下 namespace constructordemo1 class program 注意 建構函式的執行順序為 成員初始化 基類構造函式呼叫 建構函式體執行 型別構造器,也稱為靜態構造器。它的作用是設定...

讀雜書的總結

國慶節放假,抽空在家讀了幾本非技術類的書。在此把感想記錄幾條。一 有願望未必一定能成功,要看 長期 的願景和 近期 的利益是否有很大的衝突之處。如果有,應該如何準備應急預案。凡制定計畫,一定要有應急預案。二 競爭雙方的最後的成功與失敗,往往不是表面上所見的那麼簡單。中國歷史和世界歷史上的戰爭,大多如...

讀 的疑惑總結

編譯環境 作業系統 red hat 5.6 i386 編譯器 gcc 4.1.2 條款05 了解c 默默編寫並呼叫哪些函式 如果某個base classes將copy assignment操作符宣告為private,編譯器將拒絕為其派生類生成乙個copy assignment?include nam...