C#委託和事件的簡單實例

  • 2020 年 3 月 15 日
  • 筆記

委託

C#里這個委託我的理解是可以看成是一個方法模板的類型。(不過並沒有找到相關的理解
比如有幾個返回值,參數列表類型相同的方法,就能用同個模板類型來表示,然後實例化一個委託類型就綁定上一個或多個方法,然後就可以一次調用這多個方法,相當於把方法對象化?。

using System;  namespace test {      class Test{          static void fun1(int a) {              Console.WriteLine("fun one {0}",a);          }          static void fun2(int a)          {              Console.WriteLine("fun two {0}", a);          }          static void fun3(int a)          {              Console.WriteLine("fun three {0}", a);          }            //定義一個委託類型          public delegate void fun(int b);          static void Main(string[] args)          {              fun a, b, c, d,e;              //綁定方法              a = fun1;              b = fun2;              c = fun3;              d = fun1;              d += fun2;              d += fun3;              e = new fun(fun1);              //調用方法              a(1);              b(2);              c(3);              d(4);              d -= fun2;              d(4);              e(2);              Console.ReadKey();          }      }  }

事件

事件需要用到委託,或者說是一種特殊的委託。
事件比起委託其實就多了一個關鍵字event,起到一個對委託的保護作用,有了event,外部就無法直接去調用發布者內部的委託,因為這是不合理的,發布者何時發布這個委託函數應該是發布者自己決定的。

using System;  namespace test {      /***********發布器類***********/      public class EventTest      {          public delegate void NumManipulationHandler(); //聲明委託          public NumManipulationHandler ChangeNum; //聲明事件            public void OpenDoor()          {              ChangeNum();  //事件觸發          }      }        /***********訂閱器類***********/      public class subscribEvent      {          public void printf()          {              Console.WriteLine("The door is opened.");          }      }        /***********觸發***********/      public class MainClass      {          public static void Main()          {              EventTest e = new EventTest(); /* 實例化事件觸發對象 */              subscribEvent v = new subscribEvent(); /* 實例化訂閱事件對象 */                /* 訂閱器的printf()在事件觸發對象中註冊到委託事件中 */              e.ChangeNum += new EventTest.NumManipulationHandler(v.printf);              e.OpenDoor(); /* 觸發了事件 */              e.ChangeNum();              Console.ReadKey();          }      }  }