不少人說,事件即委託。真的是這樣嗎?那麼微軟爲什麼又要定義事件與委託兩個概念呢?
其實事件即委託,在我看來不如這樣解釋:事件是封裝過的委託實例。也就是說,事件是面向對象的產物,它是封裝性比較典型的示例。安全
事件其實是一個特殊的委託實例,不用事件也沒有關係。實際上事件只是削弱了委託的功能,event在編譯器角度保護了你程序的安全,由於你只能使用+=、-=來註冊事件了,而不能使用 = 爲事件關聯方法。(在委託中還能夠使用=來綁定方法,不過=是一種破壞性代碼,無論以前是否已經綁定的有方法了,他都會將其清除)函數
同一個方法你能夠使用委託來調用,你也能夠使用事件來調用。那究竟有何不一樣?
其實事件就是一個狹義的委託,也就是事件是一個用於事件驅動模型的專用委託.你能夠在客戶代碼中直接調用委託來激發委託指向的函數,而事件不能夠,事件的觸發只能由服務代碼本身觸發。也就是說在你的代碼裏委託你不但能夠安排誰是它的調用函數,還能夠直接調用它,而事件不能直接調用,只能經過某些操做觸發。除此之此,事件擁有委託的全部功能,包括多播特性。即事件能夠有多個事件處理函數,委託一樣也能夠是個多播委託.對象
public class Heater
{
private int temperature;
public void BoilWater()
{
for (int i = 1; i <= 100; i++)
{
temperature = i;
if (temperature > 95 && BoilEvent != null)
{
//執行委託,無需知道要執行哪些方法
BoilEvent(temperature);
}
}
}
public delegate void BoilHandle(int param);
public event BoilHandle BoilEvent;//封裝了委託
}
public class Alarm
{
public void MakeAlert(int param)
{
Console.WriteLine("Alarm:水溫已經超過{0}度.",param);
}
}
public class Display
{
public void ShowMsg(int param)
{
Console.WriteLine("Display:水已燒開,當前溫度{0}度.", param);
}
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.BoilEvent += alarm.MakeAlert;
heater.BoilEvent += new Display().ShowMsg;
heater.BoilWater();
}
}事件