什麼是事件?
事件是類的一種成員。如果型別定義了事件,那麼它就可以通知其它物件發生了特定的事情(比如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...