C#委託和事件的簡單例項
阿新 • • 發佈:2020-03-15
# 委託
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();
}