我們可以通過(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)方法的引用
}
事件訪問(wèn)器表現(xiàn)為void方法,也就是不能使用會(huì)返回值的return語(yǔ)句
完整示例:
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ù)的值即為客戶(hù)程序調(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();
//將委托從事件中撤銷(xiāo)
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!");
}
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注