一、發(fā)布者和訂閱者
發(fā)布者/訂閱者模式(publish/subscriber pattern): 很多程序都有一個共同的需求,即當一個特定的程序事件發(fā)生時,程序的其他部分可以得到該事件已經(jīng)發(fā)生的通知。
發(fā)布者:
- 發(fā)布者類定義了一系列程序的其他部分可能感興趣的事件。
- 發(fā)布某個事件的類或結(jié)構(gòu),其他類可以在該事件發(fā)生時得到通知。
訂閱者:
- 訂閱者類可以“注冊”,以便在這些事件發(fā)生時收到發(fā)布者的通知。這些訂閱者類通過向發(fā)布者提供一個方法來“注冊”以獲取通知。
- 注冊并在事件發(fā)生時得到通知的類或結(jié)構(gòu)。
事件:
- 當事件發(fā)生時,發(fā)布者“觸發(fā)事件”,然后執(zhí)行訂閱者提交的所有事件。
- 調(diào)用(invoke)或觸發(fā)(fire)事件的術語。當事件被觸發(fā)時,所有注冊到它的方法都會被依次調(diào)用。
事件是一種特殊的多播委托。(術語定義來源:Microsoft 開發(fā)文檔:事件)
事件是類或結(jié)構(gòu)的成員。
事件處理程序:
- 回調(diào)方法。由訂閱者提供的方法稱為回調(diào)方法,因為發(fā)布者通過執(zhí)行這些方法來“往回調(diào)用訂閱者的方法”。它們是為處理事件而調(diào)用的代碼。
- 由訂閱者注冊到事件的行為,在發(fā)布者出發(fā)事件時執(zhí)行。
事件包含了一個私有的委托。
有關事件的私有委托:
- 事件提供了對它的私有控制委托的結(jié)構(gòu)化訪問。也就是說,你無法直接訪問委托。
- 事件中可用的操作比委托要少,對于事件我們只可以添加、刪除或者調(diào)用事件處理程序。
- 事件被觸發(fā)時,它調(diào)用委托來依次調(diào)用調(diào)用列表中的方法。
圖15-3演示:
- Incrementer 定義了一個 CountedADozen 事件。
- 訂閱者類 Dozens 和 SomeItherClass 各有一個注冊到 CountedADozen 事件的事件處理程序。
- 每當觸發(fā)事件時,都會調(diào)用這些處理程序。
二、源代碼組件概覽
源代碼組件:
- 委托類型聲明: 事件和事件處理程序必須有共同的簽名和返回類型,它們通過委托類型進行描述。
- 事件處理程序聲明: 訂閱者類中會在事件觸發(fā)時執(zhí)行的方法聲明。它們不一定是顯式命名的方法,還可以是匿名方法或 Lambda 表達式。
- 事件聲明: 發(fā)布者類必須聲明一個訂閱者可以注冊的事件成員。當類聲明的事件為 public 時,稱為發(fā)布了事件。
- 事件注冊: 訂閱者必須注冊事件才能在事件被觸發(fā)時得到通知。這是將事件處理程序與事件相連的代碼。
- 觸發(fā)事件的代碼: 發(fā)布者類中的”觸發(fā)“事件并導致調(diào)用注冊的所有事件處理器的代碼。
三、聲明事件
public event EventHandler CountedADpzen;
//聲明多個事件
public event EventHandler MyEvent1,MyEvent2,OtherEvent;
//靜態(tài)事件
public static event EventHandler CountedADozen;
事件是類或結(jié)構(gòu)的成員。
由于事件是成員:
- 我們不能在一段可執(zhí)行代碼中聲明事件;
- 它必須聲明在類或結(jié)構(gòu)中,和其他成員一樣。
事件成員被隱式自動初始化為 null;
四、訂閱事件
訂閱者向事件添加事件處理程序。
-
使用 += 運算符來為事件添加事件處理程序。文章來源:http://www.zghlxwxcb.cn/news/detail-478642.html
-
事件處理程序的規(guī)范可以是以下任意一種:文章來源地址http://www.zghlxwxcb.cn/news/detail-478642.html
- 實例方法的名稱;
- 靜態(tài)方法的名稱;
- 匿名方法;
- Lambda 表達式。
到了這里,關于(七)CSharp-CSharp圖解教程版-事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!