event是一種特殊的delegate,定義它們的類里邊,這二者是一樣的,既可以采用 += 和-=的運算符號,也可以調用,但是在這個類之外,它們是不同的。
同為public類型,對於delegate,我們在定義它的類外,不僅可以采用 += 和-=的運算符號,還可隨時調用;但是對於event,在類外只能采用 += 和-=的運算符號,不能調用,也就是event把它本身的invoke函數和括號調用的函數變成擁有這個event類的私有函數。
舉個例子:
public class Publisher
{
public delegate void SampleEventHandler(string e);
public event SampleEventHandler SampleEvent; // 只能在類內部調用
public SampleEventHandler NoEvent;//可以在類外調用
protected void RaiseSampleEvent(string str) //聲明一個方法,調用類內部的event,一邊外部可以調用類內部的event
{
// 調用類內部的event,沒有問題
SampleEvent(str);
}
}
//外部的調用
public void testEvent()
{
Publisher publisher = new Publisher();
publisher.NoEvent += TestEvent; //給delegate賦值。
publisher.NoEvent("e"); // 調用delegate,沒有問題
publisher.SampleEvent += TestEvent; // 給event賦值,這沒有問題
publisher.SampleEvent("e"); //調用event,這個就錯了,只能在Publisher內部調用
}
還有一點,event只能被本類調用,其他的即使該類的派生類也不行,如果非要調用類內部的event,可以先聲明一個方法,在該方法中調用event,例如Publisher類中的RaiseSampleEvent方法。
MSDN中關於在派生類中調用event
在創建可用作其他類的基類的類時,應考慮如下事實:事件是特殊類型的委托,只可以從聲明它們的類中調用。 派生類無法直接調用基類中聲明的事件。 盡管有時需要事件僅由基類引發,但在大多數情形下,應該允許派生類調用基類事件。 為此,您可以在包含該事件的基類中創建一個受保護的調用方法。 通過調用或重寫此調用方法,派生類便可以間接調用該事件。