C#事件訪問(wèn)器詳解
我們可以通過(guò)為事件定義事件訪問(wèn)器,來(lái)控制事件運(yùn)算符+=、-=運(yùn)算符的行為
•有兩個(gè)訪問(wèn)器:add和remove
•聲明事件的訪問(wèn)器看上去和聲明一個(gè)屬性差不多
下面示例演示了具有訪問(wèn)器的聲明.兩個(gè)訪問(wèn)器都有叫做value的隱式值參數(shù),它接受實(shí)例或靜態(tài)方法的引用
public event EventHandler Elapsed
{
add
{
//... 執(zhí)行+=運(yùn)算符的代碼
}
remove
{
//... 執(zhí)行-=運(yùn)算符的代碼
}
}
聲明了事件訪問(wèn)器后,事件不包含任何內(nèi)嵌委托對(duì)象.我們必須實(shí)現(xiàn)自己的機(jī)制來(lái)存儲(chǔ)和移除事件的方法
事件訪問(wèn)器表現(xiàn)為void方法,也就是不能使用會(huì)返回值的return語(yǔ)句
完整示例:
//聲明一個(gè)delegate
delegate void EventHandler();
class MyClass
{
//聲明一個(gè)成員變量來(lái)保存事件句柄(事件被激發(fā)時(shí)被調(diào)用的delegate)
private EventHandler m_Handler = null;
//激發(fā)事件
public void FireAEvent()
{
if (m_Handler != null)
{
m_Handler();
}
}
//聲明事件
public event EventHandler AEvent
{
//添加訪問(wèn)器
add
{
//注意,訪問(wèn)器中實(shí)際包含了一個(gè)名為value的隱含參數(shù)
//該參數(shù)的值即為客戶程序調(diào)用+=時(shí)傳遞過(guò)來(lái)的delegate
Console.WriteLine("AEvent add被調(diào)用,value的HashCode為:" + value.GetHashCode());
if (value != null)
{
//設(shè)置m_Handler域保存新的handler
m_Handler = value;
}
}
//刪除訪問(wèn)器
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;
//將委托注冊(cè)到事件
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!");
}
}
- C#簡(jiǎn)單的通用基礎(chǔ)字典實(shí)現(xiàn)方法
- 詳解C#中的接口屬性以及屬性訪問(wèn)器的訪問(wèn)限制
- 結(jié)合Visual C#開發(fā)環(huán)境講解C#中事件的訂閱和取消訂閱
- C#3.0使用EventLog類寫Windows事件日志的方法
- C#自定義事件監(jiān)聽實(shí)現(xiàn)方法
- 詳解C#編程中.NET的弱事件模式
- C#中datagridview的EditingControlShowing事件用法實(shí)例
- C#事件用法實(shí)例淺析
- C#自定義事件及用法實(shí)例
- 在C#使用字典存儲(chǔ)事件示例及實(shí)現(xiàn)自定義事件訪問(wèn)器
相關(guān)文章
C#實(shí)現(xiàn)自定義FTP操作封裝類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)自定義FTP操作封裝類,涉及C#操作FTP的連接、傳輸、下載等操作的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
使用HttpHanlder處理404:File not found的問(wèn)題
本篇文章小編為大家介紹。使用HttpHanlder處理404:File not found的問(wèn)題。需要的朋友參考下2013-04-04
Unity給物體添加多個(gè)Tag的實(shí)現(xiàn)
這篇文章主要介紹了Unity給物體添加多個(gè)Tag的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法,文中詳細(xì)描述了C#生成互不相同隨機(jī)數(shù)的各個(gè)步驟及所用到的函數(shù),非常具有借鑒價(jià)值,需要的朋友可以參考下2014-09-09
C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)
C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
一文帶你快速學(xué)會(huì)C#中WinForm框架的使用詳解
WinForm是一門非常經(jīng)濟(jì)實(shí)惠的技術(shù),就是說(shuō),可以在短時(shí)間內(nèi)學(xué)會(huì),并迅速借此進(jìn)行項(xiàng)目開發(fā)。本文就來(lái)和大家聊聊WinForm框架的使用方法,希望對(duì)大家有所幫助2023-02-02
跳一跳自動(dòng)跳躍C#代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了跳一跳自動(dòng)跳躍C#代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

