C# 事件機制

在所有關于C#事件機制的介紹中,我更傾向于發布者/訂閱者(Publisher/Subscriber)這種描述。理解事件機制并不是一件容易的事情,它所涉及的思想值得我們好好去研究。

本文資源來自《C#與.NET技術平臺實戰演練》——中國青年出版社

談到事件,我們涉及到兩個角色:事件發布者(Publisher)和事件訂閱者(Scriber),也可以說是事件發送者(Sender)和事件接收者(Receiver)的關系。舉個例子來說,市面上目前有許多雜志,雜志的種類也很多。而我只對其中的某些感興趣,那么我就可以向雜志發行商提出訂閱。之后,每當雜志發行時,我就會收到我在雜志發行商那兒訂閱的雜志。在這個關系中,雜志發行商就相當于事件發行者,而我就是事件訂閱者。每當雜志發行時,就觸發了一個發行事件。

用面向對象的語言解釋,這兩者的意義如下:

事件發行者(Publisher)

它是一個對象,且會維護自身的狀態信息。每當狀態信息發生變動時,便觸發一個事件,并通知所有的事件訂閱者。對于雜志發行商來說,每本雜志都有自己的信息在里面,當雜志發行時,我要通知訂閱該雜志的人:雜志已經發行啦,請注意查收!

事件接收者(Receiver)

這個對象要注冊它感興趣的對象,也就是訂閱它自己喜歡的雜志啦。另外,這個對象通常要提供一個事件處理方法,在事件發行者觸發一個事件后,會自動執行這個方法。對于上面所舉的例子來說,也就是我收到雜志后要做什么事情,比如,你可以滿世界地大喊:我收到雜志啦!也可以將雜志收藏起來慢慢欣賞,具體怎么實現完全取決你自己的喜好。

以下是.NET事件處理機制的模型:

?下面給一個簡單的例子,用以闡述事件的思想:

?1using?System;
?2using?System.Collections.Generic;
?3using?System.Text;
?4
?5namespace?EventDemo
?6{
?7???????public?delegate?void?SalaryCompute();????????//聲明一個代理類
?8
?9???????public?class?Employee
10???????{
11??????????????public?event?SalaryCompute?OnSalaryCompute;?????????//定義事件,將其與代理綁定
12
13??????????????public?virtual?void?FireEvent()???????//觸發事件的方法
14??????????????{
15?????????????????????if?(OnSalaryCompute?!=?null)
16?????????????????????{
17????????????????????????????OnSalaryCompute();??????//觸發事件
18?????????????????????}

19??????????????}

20???????}

21
22???????public?class?HumanResource
23???????{
24??????????????public?void?SalaryHandler()??????????//事件處理函數
25??????????????{
26?????????????????????Console.WriteLine("Salary");?????//只是打印一行字而已
27??????????????}

28
29??????????????public?static?void?Main()
30??????????????{
31?????????????????????Employee?ep?=?new?Employee();
32?????????????????????HumanResource?hr?=?new?HumanResource();
33?????????????????????ep.OnSalaryCompute+=new?SalaryCompute(hr.SalaryHandler);???????//注冊
34?????????????????????ep.FireEvent();????????//觸發事件
35?????????????????????Console.Read();
36??????????????}

37???????}

38}

39
在這個例子中,Employee類相當于一個事件發布者(Publisher),它定義了事件的相關信息,包括定義了一個事件用于計算薪水(OnSalaryCompute),以及一個觸發事件的函數(FireEvent()),為簡單起見,本例沒有加上事件參數。

與之相對應,HumanResource類則相當于一個事件訂閱者(Subscriber),它定義了一個事件處理函數(SalaryHandler()),并用+=將其與事件聯系起來,從而使事件觸發的時候能夠調用我這個方法(在本例中也就是打印一行字啦)。值得注意的一點是,事件處理函數的方法簽名要與代理的方法簽名相同,這是非常重要的一點。

下面將這個例子改造一下,事件參數信息,用以完善事件機制。

?1using?System;
?2using?System.Collections.Generic;
?3using?System.Text;
?4using?System.Threading;
?5
?6namespace?EventDemo
?7{
?8???????public?delegate?void?SalaryCompute(object?sender,MyEventArgs?e);????????//聲明一個代理類
?9
10???????public?class?Employee
11???????{
12??????????????public?event?SalaryCompute?OnSalaryCompute;?????????//定義事件,將其與代理綁定
13
14??????????????public?virtual?void?FireEvent(MyEventArgs?e)???????//觸發事件的方法
15??????????????{
16?????????????????????if?(OnSalaryCompute?!=?null)
17?????????????????????{
18????????????????????????????OnSalaryCompute(this,e);??????//觸發事件
19?????????????????????}

20??????????????}

21???????}

22
23???????public?class?MyEventArgs?:?EventArgs?????????//定義事件參數類
24???????{
25??????????????public?readonly?double?_salary;
26??????????????public?MyEventArgs(double?salary)
27??????????????{
28?????????????????????this._salary?=?salary;
29??????????????}

30???????}

31
32???????public?class?HumanResource
33???????{
34??????????????public?void?SalaryHandler(object?sender,MyEventArgs?e)??????????//事件處理函數,其簽名應與代理簽名相同
35??????????????{
36?????????????????????Console.WriteLine("Salary?is?{0}",e._salary);?????//只是打印一行字而已
37??????????????}

38
39??????????????public?static?void?Main()
40??????????????{
41?????????????????????Employee?ep?=?new?Employee();
42?????????????????????HumanResource?hr?=?new?HumanResource();
43?????????????????????MyEventArgs?e?=?new?MyEventArgs(123.40);
44?????????????????????ep.OnSalaryCompute+=new?SalaryCompute(hr.SalaryHandler);???????//注冊
45?????????????????????for?(;?;?)
46?????????????????????{
47????????????????????????????Thread.Sleep(1000);??????//讓程序“睡”一秒
48????????????????????????????ep.FireEvent(e);????????//觸發事件
49?????????????????????}

50?????????????????????//Console.Read();
51??????????????}

52???????}

53}

54

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255652.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習vue.js 第一天

最近聽到很多人都在用Vue.js ,我也想湊湊熱鬧,來個入門 啥的 ,要不以后人家說,啥都不知道,多low 看到官網 是這樣介紹Vue.js Vue.js(讀音 /vju?/, 類似于 view) 是一套構建用戶界面的 漸進式框架。與其他重…

【數據庫學習】——從零學習SQL語句(含SQL數據類型、SQL語句實例操作)

目錄 ? 0、創建數據庫 1、調用指定的數據庫 2、創建數據表 2.1、SQL數據類型 1).字符型數據: 3).整數型數據 4).精確小數型數據 5).近似數值類型 6).貨幣型數據 7).位類型數據 2.2…

第一次面試實習生經歷

面的.net方向的 1,研究的方向,有沒有看過相關論文,了解下前沿技術、國內外發展現狀。云存儲安、云計算。沒有了解過相關內容。沒有聊多少,是自己知識上的欠缺。曾經有想過看看相關內容。研究下云計算相關知識。但到如今沒有付諸實…

struts2學習筆記(常見錯誤)

1、由于筆者使用的時最新的struts2 (version 2.5.14.1),之前下載的是all , 一直配置不上,然后查了google才下載的min版本。 這里面有配置struts2需要的必備的jar包,而至于上面的all里面lib里面的jar包實在太多,雖然我…

探尋C#事件本質1

我最先在學習C#事件的時候,閱讀了許多書籍,但總是不能對事件建立起一個比較清晰的概念,對其內部機制和原理也是似是而非,因為這些書籍在描述事件的時候總是夾雜許多其他不能理解的抽象術語,相信許多初學者都有這樣的感…

C#圖解教程 第十二章 數組

數組數組定義重要細節數組的類型數組是對象一維數組和矩形數組實例化一維數組或矩形數組訪問數組元素初始化數組顯式初始化一維數組顯式初始化矩形數組快捷語法隱式類型數組綜合內容交錯數組聲明交錯數組快捷實例化實例化交錯數組比較矩形數組和交錯數組foreach語句迭代變量是只…

【數據庫學習】——windows、MySQL構建新聞管理系統(控制臺版)

學習記錄:【Python項目實戰】PythonMySQL開發新聞管理系統全集_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1Qb4y1b75q?p2&spm_id_frompageDriver 目錄 一、項目介紹 1、項目結構 2、系統部分功能提前展示 3、項目流程圖 4、項目設計的數據庫以及…

matlab張量工具初步

最近從桑迪亞實驗室下載了張量工具包。但是不太會用。 很多網上的方法, addpath(pwd) cd met; addpath(pwd) savepath Mones(4,3,2); Xtensor(M); Xtensor(rand(5,1)) Ytensor(rand(4,3,1)) Xtenrand([4 3 2]) X.size %*************************** Rsptenrand([5 4…

微信紅包API接口(PHP)

發布時間:2015年2月25日 / 分類:WEB開發,PHP / 74,825 / 241 ℃ 根據微信高級紅包接口,開發PHP版本的API接口,現在進行主要代碼分析。 紅包接口調用請求代碼,所有請求參數為必填參數與文檔對應: 1234567891…

2016年個人技術總結(前端)

自我總結 參與項目 備注:[☆-表示比較吊的項目,-從頭開始做,^-中間加入項目] 神馬生活(微信公眾號商城)[^] 神馬學院[] <!------跳槽線--------> 大數據套件[☆][^] fable數據營銷平臺(加入新功能&#xff0c;交互)[^] fit問卷系統[] fit投放系統[] fit畫像[^] 理財通點擊…

淺談OpenCV[轉]

OpenCV是一個由Interl公司支持的開源機器視覺庫&#xff0c;關于它的介紹&#xff0c;網上隨便一搜就車載斗量。這里我不談OpenCV的主要內容&#xff0c;而是將這段時間來對它的使用心得作個簡單介紹&#xff0c;以啟發打算用這個庫的朋友的思路&#xff0c;與大家一起來分享。…

【pyqt5學習】——tablewidget控件學習

目錄 1、Table Widget 1.QTableWidget不能在mainwindow中隨主窗口的大小變化&#xff1f; 2.將表格變為禁止編輯&#xff1a; 3.設置表格為整行選擇 4.單個選中和多個選中的設置&#xff1a; 5.表格表頭的顯示與隱藏 6.對表頭文字的字體、顏色進行設置 7.在單元格里加入…

吳忠軍 - 如何理解馬云所說的月入兩三萬,三四萬的人最幸福?

這句話源于一段兩分鐘的視頻&#xff0c;馬云的一次阿里內部會議演講。 馬云坦承&#xff0c;自己從第一天起就沒想過當首富&#xff0c;還為此稀釋公司持股&#xff0c;“沒想到把自己的股份降到8%&#xff0c;還是有那么多&#xff0c;這是我沒有想到的。” 在馬云看來&#…

iOS小知識點(非UI部分)

1。 _cmd 表示當前方法的SEL指針&#xff0c; - (void)putString{} 對于這個函數_cmd 等效于selector(putString)轉載于:https://www.cnblogs.com/dongfangchun/p/5341599.html

jQuery 操作 CSS

jQuery 擁有若干進行 CSS 操作的方法。我們將學習下面這些&#xff1a; addClass() - 向被選元素添加一個或多個類removeClass() - 從被選元素刪除一個或多個類toggleClass() - 對被選元素進行添加/刪除類的切換操作css() - 設置或返回樣式屬性轉載于:https://www.cnblogs.com/…

彩色CCD相機工作原理

原理 黑白&#xff08;單色&#xff09;相機 CCD原理并不復雜。我們可以把它想象成一個頂部被打開的記憶芯片。因此光束可以射到記憶單元中。根據"光電效應”&#xff0c;這些光束在記憶單元中產生負電荷&#xff08;下圖中右上部分&#xff09;。 曝光后&…

Linux 系統常用命令匯總(二) vi 文本編輯

文本編輯vi命令作用文件名編輯文本文件&#xff0c;若文件不存在同時創建該文件Ctrlf向后翻一頁Ctrlb向前翻一頁Ctrld向后翻半頁Ctrlu向前翻半頁光標移動到下一行-光標移動到上一行數字空格光標向右移動n個字符0移動到本行首個字符處$ 移動到本行最后一個字符處H光標移動到屏幕…

圖像處理與計算機視覺:基礎,經典以及最近發展(2)圖像處理與計算機視覺相關的書籍

1. 數學 我們所說的圖像處理實際上就是數字圖像處理&#xff0c;是把真實世界中的連續三維隨機信號投影到傳感器的二維平面上&#xff0c;采樣并量化后得到二維矩陣。數字圖像處理就是二維矩陣的處理&#xff0c;而從二維圖像中恢復出三維場景就是計算機視覺的主要任務之一。這…

【HTML學習】——HTML常見標簽屬性和方法介紹

目錄 1、HTML分塊--------< div> 2、HTML段落--------< p> 3、HTML標題--------< h1>…< h6> 4、HTML鏈接--------< a> 1)< a href“http://www.baidu.com”>百度< /a>&#xff08;點擊百度&#xff0c;直接跳轉到網頁&#xf…

開發者應警惕的七種糟糕職業規劃錯誤

那些心靈雞湯式的說辭總愛美化失敗&#xff1a;失敗是成功之母啦、失敗使人成長啦、別畏懼失敗等等。但事實上&#xff0c;這種思路在軟件開發領域也許并不適用——至少不完全適用。每位開發者在職業生涯中都不可避免會遭遇失敗&#xff0c;但為什么不從他人的經驗中汲取教訓來…