zoukankan      html  css  js  c++  java
  • 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("这是实例方法");
            }
        }
    
    • 从委托链中移除委托,使用"-" 运算符移除
  • 相关阅读:
    英语----非谓语动词to do
    英语----非谓语动词done
    英语----三大从句的混合实战
    英语----状语从句连接词(下)
    英语----状语从句连接词(中)
    英语----状语从句连接词(上)
    xcode7.3遇到的问题
    UIScrollView AutoLayout
    cocoapods 卸载  &  安装
    iOS即时通讯之CocoaAsyncSocket源码解析五
  • 原文地址:https://www.cnblogs.com/youMo/p/10360409.html
Copyright © 2011-2022 走看看