事件和委托的區別


很多人說,事件即委托。真的是這樣嗎?那么微軟為何又要定義事件與委托兩個概念呢?
其實事件即委托,在我看來不如這樣解釋:事件是封裝過的委托實例。也就是說,事件是面向對象的產物,它是封裝性比較典型的示例。

事件實際上是一個特殊的委托實例,不用事件也沒有關系。實際上事件只是削弱了委托的功能,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();
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM