1. 程式人生 > >C#委託和事件的簡單例項

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

# 委託 C#裡這個委託我的理解是可以看成是一個**方法模板的型別**。(不過並沒有找到相關的理解 比如有幾個返回值,引數列表型別相同的方法,就能用同個模板型別來表示,然後例項化一個委託型別就繫結上一個或多個方法,然後就可以一次呼叫這多個方法,相當於把方法物件化?。 ```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,外部就無法直接去呼叫釋出者內部的委託,因為這是不合理的,釋出者何時釋出這個委託函式應該是釋出者自己決定的。 ```c# 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(); }