委托

委托:关键字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方法
原文地址:https://www.cnblogs.com/xiaoyaodijun/p/5098354.html