zoukankan      html  css  js  c++  java
  • 委托

    委托:关键字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方法
  • 相关阅读:
    ApplicationContext之getBean方法详解
    Windows10终端优化方案:Ubuntu子系统+cmder+oh-my-zsh
    向 Windows 高级用户进阶,这 10 款效率工具帮你开路 | 新手问号
    Ditto —— windows 剪贴板增强小工具(复制粘贴多条记录)
    Service Mesh服务网格:是什么和为什么
    正确理解Spring事务和数据库事务和锁
    Spring中@Transactional事务回滚(含实例详细讲解,附源码)
    五分钟搞清楚MySQL事务隔离级别
    事务并发的问题场景图解
    Spring的事务管理和数据库事务相关知识
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/5098354.html
Copyright © 2011-2022 走看看