1. 簡介:
類或?qū)ο罂梢酝ㄟ^事件向其他類或?qū)ο笸ㄖl(fā)生的相關(guān)事情。 發(fā)送事件的類稱為“發(fā)行者”裹纳,接收事件的類稱為“訂閱者”。
事件基于委托。
2. 事件概述
發(fā)行者確定何時引發(fā)事件闯团;訂閱者確定對事件作出何種響應(yīng)。
一個事件可以有多個訂閱者仙粱。訂閱者可以處理來自多個發(fā)行者的多個事件房交。
沒有訂閱者的事件永遠也不會引發(fā)。
事件通常用于表示用戶操作伐割,例如單擊按鈕或圖形用戶界面中的菜單選項候味。
當(dāng)事件具有多個訂閱戶時,引發(fā)該事件時會同步調(diào)用事件處理程序隔心。
在 .NET Framework 類庫中白群,事件基于 EventHandler委托和 EventArgs基類。
3. 訂閱和取消事件
聲明一個事件: public event Action 事件名稱;
對事件添加訂閱: 事件名稱 += 要添加的方法名硬霍。
對事件取消訂閱: 事件名稱 -= 要取消的方法名帜慢。取消所有的方法后,事件會置為null唯卖。
**事件的調(diào)用: ** 事件名稱(); 事件的調(diào)用只能在聲明事件的類中調(diào)用粱玲,不可在該類之外調(diào)用。
4. 事件案例
學(xué)校有上課鈴和下課鈴拜轨。
當(dāng)老師聽到上課鈴后抽减,給學(xué)生開始講課,讓學(xué)生聽講橄碾。
當(dāng)老師聽到下課鈴后卵沉,停止講課颠锉,開始休息,并讓學(xué)生休息偎箫。
5. 為接口添加事件
接口可聲明事件木柬。 下面的示例演示如何在類中實現(xiàn)接口事件。
public interface Interface1
{
event Action Test1;
}
public class Person : Interface1
{
public string name;
private int age;
public event Action Test1;
public override string ToString()
{
if(Test1 != null)
{
Test1();
}
return this.name;
}
}
6淹办、兩個接口中有相同事件
下面的示例演示如何處理以下的不常見情況:您的類是從兩個以上的接口繼承的眉枕,每個接口都含有同名事件)。 在這種情況下怜森,您至少要為其中一個事件提供顯式接口實現(xiàn)速挑。 為事件編寫顯式接口實現(xiàn)時,必須編寫 add和 remove事件訪問器副硅。 這兩個事件訪問器通常由編譯器提供姥宝,但在這種情況下編譯器不能提供。
public interface Interface1
{
event Action Test1;
}
interface Interface2
{
event Action Test1;
}
public class Person : Interface1 , Interface2
{
private object lockObj = new object();
public event Action inter1Test1;
event Action Interface1.Test1
{
add
{
lock (lockObj)
{
inter1Test1 += value;
}
}
remove
{
lock (lockObj)
{
inter1Test1 -= value;
}
}
}
public event Action Test1;
}