• 委托


    委托:关键字delegate,委托并不不等同于方法,而是一个引用类型,类似于C++中的指针,委托本质上是一个类

    一:声明一个委托

    namespace Test.Delegate
    {
        public static class JieShouValue
        {
            //声明一个委托
            public delegate void ValDelegate(int day);
            //声明一个委托变量
            public static ValDelegate UserHt;
    
            //创建一个方法
            public static void chafa(int day)
            {
                Console.WriteLine("你好+"+day);
            }
        }
    }
        class Program
        {
            //声明一个委托
            public delegate void MyDelegate(int userId, string userName);
            static void Main(string[] args)
            {
                MyDelegate md=new MyDelegate(GetValue);
                md(2016, "wangds");
                JieShouValue.UserHt=new JieShouValue.ValDelegate(Jian);
                JieShouValue.UserHt(2017);
                JieShouValue.UserHt = new JieShouValue.ValDelegate(JieShouValue.chafa);
                JieShouValue.UserHt(2018);
                Console.ReadKey();
            }
    
            //方法
            public static void GetValue(int id, string name)
            {
                Console.WriteLine("id="+id+"name="+name);
            }
    
            //方法
            public static void Jian(int day)
            {
                Console.WriteLine("day=" + day);
            }
        }
    委托的实现原理:在静态类JieShouValue中声明一个ValDelegate委托类型,里面还有一个和方法,方法参数和委托的参数类型和数量相同,即是委托的关联方法。
    
    实例化委托的时候,将方法JieShouValue.chafa传递给ValDelegate构造器,即将chafa指派给ValDelegate委托,并将该引用赋值给JieShouValue.UserHt变量,也就表示UserHt变量保存了指向chafa方法的引用,以此来实现对chafa的回掉。

    委托链

        class Program
        {
            //声明一个委托
            public delegate void MyDelegate(int userId, string userName);
            static void Main(string[] args)
            {
                MyDelegate md=new MyDelegate(GetValue);
                md(2016, "wangds");
                //进行绑定(+=是进行绑定,-=是解除绑定)
                JieShouValue.UserHt+=new JieShouValue.ValDelegate(Jian);
                JieShouValue.UserHt += new JieShouValue.ValDelegate(JieShouValue.chafa);
                JieShouValue.UserHt(2018);
                Console.ReadKey();
            }
    
            //方法
            public static void GetValue(int id, string name)
            {
                Console.WriteLine("id="+id+"name="+name);
            }
    
            //方法
            public static void Jian(int day)
            {
                Console.WriteLine("day=" + day);
            }
        }
    委托链中,+=操作调用的是Delegate.Combine方法
             -=操作调用的是Delegate.Remove方法
  • 相关阅读:
    java获取指定日期的前一天和后一天
    Swagger注解-@ApiModel 和 @ApiModelProperty
    Timer中schedule()的用法
    Spring Boot 增加jar包
    报Result Maps collection does not contain value for java.lang.Long错误解决方法
    服务注册组件eureka
    浅谈redission以及Redis分布式锁探索入门
    用Redis实现分布式锁以及redission使用
    JVM逃逸分析对性能的影响
    【HTML打印】HTML直接调用window下的打印机并执行打印任务(简单打印任务生成)
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/5098354.html
Copyright © 2020-2023  润新知