Loading

C#中的委托

什么是委托

  • 可以使得C#中的函数作为参数来传递
  • 委托的定义,使用delegate关键字
    public delegate void MyDelegate(int para1,string para2);
    
  • 委托能包装的方法是有一定限制的
    • 方法的签名必须与委托一直,方法签名包括参数的个数,类型的顺序;
    • 方法的返回类型要和委托一致

委托的使用

    /// <summary>
    /// 委托使用演示
    /// </summary>
    class Program
    {
        //1,使用delegate关键字定义一个委托类型
        delegate void MyDelegate(int para1,int para2);
        static void Main(string[] args)
        {
            //2,声明委托变量d
            MyDelegate d;
            //3,实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
            d = new MyDelegate(new Program().Add);
            //4,委托类型作为参数传递给另一个方法
            MyMethod(d);
            Console.ReadLine();
        }
        /// <summary>
        /// 该方法的定义必须与委托定义相同,即返回类型为 void ,二个 int 类型的参数
        /// </summary>
        /// <param name="para1"></param>
        /// <param name="para2"></param>
        void Add(int para1,int para2)
        {
            int sum = para1 + para2;
            Console.WriteLine("两个数的和为:"+sum);
        }

        /// <summary>
        /// 方法的参数是委托类型
        /// </summary>
        /// <param name="myDelegate"></param>
        private static void MyMethod(MyDelegate myDelegate)
        {
            //5,在方法中调用委托
            myDelegate(1, 2);
        }
    }

为什么使用委托

  • 引入委托之后,可以将函数作为参数传递给另一个方法.可以提高方法的扩展性
//代码演示
class Program
    {
        //1,定义委托类型
        public delegate void GreetingDelegate(string name);

        /// <summary>
        /// 英国人打招呼的方法
        /// </summary>
        public void EnglishGreeting(string name)
        {
            Console.WriteLine(" Hello "+ name);
        }
        /// <summary>
        /// 中国人打招呼方法
        /// </summary>
        public void ChineseGreeting(string name)
        {
            Console.WriteLine("你好 "+ name);
        }

        public void Greeting(string name ,GreetingDelegate callback)
        {
            //调用委托
            callback(name);
        }
        

        static void Main(string[] args)
        {
            Program p = new Program();

            p.Greeting("李四", p.ChineseGreeting);

            p.Greeting("Tommy Li",p.EnglishGreeting);

            Console.ReadLine();


        }
    }

委托的本质

  • 委托具有构造函数与成员函数,是类类型
    /// <summary>
    /// 委托使用演示
    /// </summary>
    class Program
    {
        //1,使用delegate关键字定义一个委托类型
        delegate void MyDelegate(int para1,int para2);
        static void Main(string[] args)
        {
            //2,声明委托变量d
            MyDelegate d;
            //3,实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
            d = new MyDelegate(new Program().Add);
            //4,委托类型作为参数传递给另一个方法
            MyMethod(d);
            Console.ReadLine();
        }
        /// <summary>
        /// 该方法的定义必须与委托定义相同,即返回类型为 void ,二个 int 类型的参数
        /// </summary>
        /// <param name="para1"></param>
        /// <param name="para2"></param>
        void Add(int para1,int para2)
        {
            int sum = para1 + para2;
            Console.WriteLine("两个数的和为:"+sum);
        }

        /// <summary>
        /// 方法的参数是委托类型
        /// </summary>
        /// <param name="myDelegate"></param>
        private static void MyMethod(MyDelegate myDelegate)
        {
            //5,在方法中使用Invoke显式调用委托
            myDelegate.Invoke(1, 2);
        }
    }

委托链

  • 链接了多个方法的委托称为委托链或多路广播委托
class Program
    {
        public delegate void DelegateTest();
        static void Main(string[] args)
        {
            DelegateTest dtstatic = new DelegateTest(Program.method1);

            DelegateTest dtinstance = new DelegateTest(new Program().method2);

            //定义一个委托对象,初始化为null,即不代表任何方法
            DelegateTest delegateTest = null;

            //使用+ 符号链接委托,链接多个委托后就成为了委托链
            delegateTest += dtstatic;
            delegateTest += dtinstance;

            //调用委托
            delegateTest();
            Console.WriteLine();

            //输出结果
            //这是静态方法
            //这是实例方法


        }

        //静态方法
        private static void method1()
        {
            Console.WriteLine("这是静态方法");
        }
        //实例方法
        private void method2()
        {
            Console.WriteLine("这是实例方法");
        }
    }
  • 从委托链中移除委托,使用"-" 运算符移除
posted @ 2019-02-10 22:02  幽默访客  阅读(240)  评论(0编辑  收藏  举报