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,外部就无法直接去调用发布者内部的委托,因为这是不合理的,发布者何时发布这个委托函数应该是发布者自己决定的。

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

猜你喜欢

转载自www.cnblogs.com/zxcoder/p/12497941.html