码迷,mamicode.com
首页 > Windows程序 > 详细

C#中的委托

时间:2019-02-10 23:17:15      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:delegate   oid   代码   console   另一个   lis   OLE   chinese   变量   

什么是委托

  • 可以使得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("这是实例方法");
        }
    }
  • 从委托链中移除委托,使用"-" 运算符移除

C#中的委托

标签:delegate   oid   代码   console   另一个   lis   OLE   chinese   变量   

原文地址:https://www.cnblogs.com/youMo/p/10360409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!