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();          }      }  }