C#事件訪問器詳解
我們可以通過為事件定義事件訪問器,來控制事件運(yùn)算符+=、-=運(yùn)算符的行為
•有兩個(gè)訪問器:add和remove
•聲明事件的訪問器看上去和聲明一個(gè)屬性差不多
下面示例演示了具有訪問器的聲明.兩個(gè)訪問器都有叫做value的隱式值參數(shù),它接受實(shí)例或靜態(tài)方法的引用
public event EventHandler Elapsed
{
add
{
//... 執(zhí)行+=運(yùn)算符的代碼
}
remove
{
//... 執(zhí)行-=運(yùn)算符的代碼
}
}
聲明了事件訪問器后,事件不包含任何內(nèi)嵌委托對象.我們必須實(shí)現(xiàn)自己的機(jī)制來存儲和移除事件的方法
事件訪問器表現(xiàn)為void方法,也就是不能使用會返回值的return語句
完整示例:
//聲明一個(gè)delegate
delegate void EventHandler();
class MyClass
{
//聲明一個(gè)成員變量來保存事件句柄(事件被激發(fā)時(shí)被調(diào)用的delegate)
private EventHandler m_Handler = null;
//激發(fā)事件
public void FireAEvent()
{
if (m_Handler != null)
{
m_Handler();
}
}
//聲明事件
public event EventHandler AEvent
{
//添加訪問器
add
{
//注意,訪問器中實(shí)際包含了一個(gè)名為value的隱含參數(shù)
//該參數(shù)的值即為客戶程序調(diào)用+=時(shí)傳遞過來的delegate
Console.WriteLine("AEvent add被調(diào)用,value的HashCode為:" + value.GetHashCode());
if (value != null)
{
//設(shè)置m_Handler域保存新的handler
m_Handler = value;
}
}
//刪除訪問器
remove
{
Console.WriteLine("AEvent remove被調(diào)用,value的HashCode為:" + value.GetHashCode());
if (value == m_Handler)
{
//設(shè)置m_Handler為null,該事件將不再被激發(fā)
m_Handler = null;
}
}
}
}
class Program
{
static void Main(string[] args)
{
MyClass obj = new MyClass();
//創(chuàng)建委托
EventHandler MyHandler = new EventHandler(MyEventHandler);
MyHandler += MyEventHandle2;
//將委托注冊到事件
obj.AEvent += MyHandler;
//激發(fā)事件
obj.FireAEvent();
//將委托從事件中撤銷
obj.AEvent -= MyHandler;
//再次激發(fā)事件
obj.FireAEvent();
Console.ReadKey();
}
//事件處理程序
static void MyEventHandler()
{
Console.WriteLine("This is a Event!");
}
//事件處理程序
static void MyEventHandle2()
{
Console.WriteLine("This is a Event2!");
}
}
相關(guān)文章
詳解C#方法中使用out參數(shù)做登錄判斷代碼實(shí)例
這篇文章主要介紹了C#使用out參數(shù)做登錄判斷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04C# 鼠標(biāo)穿透窗體功能的實(shí)現(xiàn)方法
通過以下代碼,在窗體啟動后調(diào)用方法SetPenetrate() 即可實(shí)現(xiàn)窗體的穿透功能,有需要的朋友可以參考一下2013-10-10asp.net(c#)編程實(shí)現(xiàn)將彩色圖片變灰階圖片的方法示例
這篇文章主要介紹了asp.net(c#)編程實(shí)現(xiàn)將彩色圖片變灰階圖片的方法,結(jié)合實(shí)例形式分析了C#圖片讀取及屬性操作相關(guān)技巧,需要的朋友可以參考下2017-07-07C#設(shè)計(jì)模式之Builder生成器模式解決帶老婆配置電腦問題實(shí)例
這篇文章主要介紹了C#設(shè)計(jì)模式之Builder生成器模式解決帶老婆配置電腦問題,簡單介紹了生成器模式的概念、功能并結(jié)合具體實(shí)例形式分析了C#生成器模式解決配電腦問題的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-09-09C#如何實(shí)現(xiàn)對sql server數(shù)據(jù)庫的增刪改查
本文的主要內(nèi)容是C#實(shí)現(xiàn)對sql server數(shù)據(jù)庫的增刪改查,示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08c#異步操作async?await狀態(tài)機(jī)的總結(jié)(推薦)
這篇文章主要介紹了c#異步操作async?await狀態(tài)機(jī)的總結(jié),關(guān)于async和await每個(gè)人都有自己的理解,甚至關(guān)于異步和同步亦或者關(guān)于異步和多線程每個(gè)人也都有自己的理解,本文通過實(shí)例代碼詳細(xì)講解,需要的朋友可以參考下2023-02-02