• 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();
            }
        }
    }
    
  • 相关阅读:
    spring mvc 数据格式化
    spring mvc 数据转换
    spring mvc
    spring
    java+hibernate+mysql
    Jenkins使用TFS部署
    Docker基本命令
    MySQL主从配置
    Jenkins邮箱设置
    vlc 控件属性和方法
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12497941.html
Copyright © 2020-2023  润新知