C#事件访问器
C#事件訪問器
我們可以通過為事件定義事件訪問器,來控制事件運算符+=、-=運算符的行為
- 有兩個訪問器:add和remove
- 聲明事件的訪問器看上去和聲明一個屬性差不多
下面示例演示了具有訪問器的聲明.兩個訪問器都有叫做value的隱式值參數,它接受實例或靜態方法的引用
public?event?EventHandler?Elapsed{
????add
????{
????????//...?執行+=運算符的代碼
????}
????
?????remove
?????{
????????//...?執行-=運算符的代碼
?????}
}
?
聲明了事件訪問器后,事件不包含任何內嵌委托對象.我們必須實現自己的機制來存儲和移除事件的方法
事件訪問器表現為void方法,也就是不能使用會返回值的return語句
?
完整示例:
??? //聲明一個delegate????delegate?void?EventHandler();
????class?MyClass
????{
????????//聲明一個成員變量來保存事件句柄(事件被激發時被調用的delegate)
????????private?EventHandler?m_Handler?=?null;
????????//激發事件
????????public?void?FireAEvent()
????????{
????????????if?(m_Handler?!=?null)
????????????{
????????????????m_Handler();
????????????}
????????}
????????//聲明事件
????????public?event?EventHandler?AEvent
????????{
????????????//添加訪問器
????????????add
????????????{
????????????????//注意,訪問器中實際包含了一個名為value的隱含參數
????????????????//該參數的值即為客戶程序調用+=時傳遞過來的delegate
????????????????Console.WriteLine("AEvent?add被調用,value的HashCode為:"?+?value.GetHashCode());
????????????????if?(value?!=?null)
????????????????{
????????????????????//設置m_Handler域保存新的handler
????????????????????m_Handler?=?value;
????????????????}
????????????}
????????????//刪除訪問器
????????????remove
????????????{
????????????????Console.WriteLine("AEvent?remove被調用,value的HashCode為:"?+?value.GetHashCode());
????????????????if?(value?==?m_Handler)
????????????????{
????????????????????//設置m_Handler為null,該事件將不再被激發
????????????????????m_Handler?=?null;
????????????????}
????????????}
????????}
????}
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????MyClass?obj?=?new?MyClass();
????????????//創建委托
????????????EventHandler?MyHandler?=?new?EventHandler(MyEventHandler);
????????????MyHandler?+=?MyEventHandle2;
????????????//將委托注冊到事件
????????????obj.AEvent?+=?MyHandler;
????????????//激發事件
????????????obj.FireAEvent();
????????????//將委托從事件中撤銷
????????????obj.AEvent?-=?MyHandler;
????????????//再次激發事件
????????????obj.FireAEvent();
????????????Console.ReadKey();
????????}
????????//事件處理程序
????????static?void?MyEventHandler()
????????{
????????????Console.WriteLine("This?is?a?Event!");
????????}
????????//事件處理程序
????????static?void?MyEventHandle2()
????????{
????????????Console.WriteLine("This?is?a?Event2!");
????????}
????}
?
轉載于:https://www.cnblogs.com/jhxk/articles/2576888.html
總結
- 上一篇: HTML之垂直居中问题
- 下一篇: EasyUI之简单实现Datagrid分