事件說明
事件一定要有發出者和事件的響應者。同時事件有一定的入口參數和返回值。事件的一系列過程由委託(delegate)來完成,委託相當於函數指針,它將事件響應函數的函數指針與類的事件字段綁定一起,用來告訴事件發出者事件發出後事件的響應函數的起始位置。事件的發出者就找到了響應函數的起始位置就可以完成事件的響應了。
事件的發出者:事件字段
產生事件:由事件字段在特定的時候發出事件
事件的響應:響應函數,由委託傳遞響應函數的函數指針。
代碼步驟
步驟①定義一個事件的委託
public delegate void SupportedProtocolClientEventHandler(AgentClient agent, string protocol);
其中:
SupportedProtocolClientEventHandler 是委託的名字,我們約定委託的名字以EventHandler結尾。
void 是委託事件的返回值類型,他規定了事件的返回值。
(AgentClient agent, string protocol) 是形參列表,他規定了事件的參數列表。
可以看出委託的定義就規定了這個事件的形參和返回值類型,即規定了一個事件類型。
注意:委託的定義一般應該定義在類體的外面,名稱空間的裏面。因爲委託的類型是Class。當然你也可以把委託的定義放在類的內部,此時這個委託相當於類的內部類。
步驟②在類的內部創建一個事件字段
public event SupportedProtocolClientEventHandler SupportedProtocolEvent;
其中:
event 是標誌了在類中定義的對象是事件字段。
SupportedProtocolClientEventHandler 是之前定義的委託,它規定了這個事件字段的事件類型,即規定了事件的形參和返回值。
SupportedProtocolEvent 是事件字段的名字,由他來發出事件。我們約定以Event結尾,因爲這樣便於識別這個字段是個事件字段。
注意:這裏我們是用字段對外公開事件的,所以要用public關鍵字修飾,不然調用者無法響應該事件。
當然,你也可以將事件字段封裝成屬性,此時你的代碼可以這樣寫
private SupportedProtocolClientEventHandler SupportedProtocolEvent;
public event SupportedProtocolClientEventHandler OnSupportedProtocol
{
add { SupportedProtocolEvent += value; }
remove { SupportedProtocolEvent -= value; }
}
這樣做,就將事件封裝成了一個屬性。對外公開的則是SupportedProtocol不再是SupportedProtocolEvent。這裏OnSupportedProtocol屬性提供了一個add和一個remove用來爲SupportedProtocolEvent事件字段完成綁定事件和解除綁定事件。而value是屬性包裝器的內置參數,此時value的類型是函數指針。
步驟③發出事件
在類的某個函數中(執行的代碼中)你可能需要發出這個類型的事件,也即當你在需要發出該事件時你只需要使用:
事件字段.Invoke(實參列表)
或
事件字段(實參列表)
來發出事件。即
SupportedProtocolEvent.Invoke(this, protocol);
或
SupportedProtocolEvent(this, protocol);
但是爲了安全起見,你應當在發出事件前判斷事件字段是否爲null。於是安全的代碼應當這樣寫:
if(SupportedProtocolEvent != null)
SupportedProtocolEvent.Invoke(this, protocol);
至此,在類中定義事件和發出事件的工作做完了,接下來就是在其他類中是用這個類並將這個類的事件綁定事件的響應代碼(或者取消事件的響應)
步驟④綁定和解綁事件
這個過程很簡單,就是調用這個類並用+=和-=來爲事件綁定響應和解除響應。
綁定事件響應:
對象.事件字段+=函數名;
或
對象.事件屬性+=函數名;
具體的舉例:
略
步驟⑤事件響應函數
略