zoukankan      html  css  js  c++  java
  • c# 委托 delegate

    委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途

    通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法。

    1. 使用委托

    委托的使用需要以下步骤:

    定义委托

    delegate double ParocessDelegate(double param1,double param2);

    委托的定义非常类似于函数,但不带函数体,且要使用delegate关键字。委托定义需要指明委托名称以及一个返回类型和一个参数列表

    声明委托类型的变量

    ProcessDelegate process;

    定义了委托后,就可以声明一个该委托类型的变量

    初始化委托变量

    process =new ProcessDelegate(Multiply);

    初始化委托变量时要把一个函数(此处Multiply为一个函数的名称)引用赋给委托变量,此函数需要具有与委托相同的返回类型和参数列表。c#使用上述略显古怪的语法,使用new关键字创建一个新的委托,参数为
    要引用所需的函数,这是委托赋值的一个独特语法,函数名称是不带括号的

    还可以用另一种略微简单的语法

    process = Muiltiply;

    有了引用函数的委托变量之后,我们就可以用委托变量调用Muiltiply函数;也可以把委托变量传递给其他函数

    process (param1,param2);

    示例:

    namespace Delegate
    {
    
            public delegate int Call(int num1, int num2);//第一步:定义委托类型
            class SimpleMath
            {
                // 乘法方法
                public int Multiply(int num1, int num2)
                {
                    return num1 * num2;
                }
    
                // 除法方法
                public int Divide(int num1, int num2)
                {
                    return num1 / num2;
                }
            }
        }
        class Test
        {
            static void Main(string[] args)
            {
                Call objCall;//第二步:声明委托变量
                // Math 类的对象
                SimpleMath objMath = new SimpleMath(); 
                // 第三步:初始化委托变量,将方法与委托关联起来
                objCall = new Call(objMath.Multiply);
    
               
                objCall += objMath.Divide;//向委托增加一个方法
                //objCall -=  objMath.Divide;//向委托减去一个方法
    
                // 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide
                int result = objCall(5, 3);
                System.Console.WriteLine("结果为 {0}", result);
                Console.ReadKey();
            }
        }

    注意事项:

    • 委托可以调用多个方法,即一个委托变量可以引用多个函数,称为多路广播
    • 可以使用+=和-=运算符实现方法的增加和减少
    • 无返回值的委托,引用了多少个方法就会执行多少个方法。有返回值的委托同样会执行多个引用的方法,但返回的值是最后一个方法的返回值

      2.  其他形式的委托

    • 匿名委托

    匿名委托使用起来更简洁一点,不用在定义一个专用的委托函数来传递方法,也更可以更好的理解委托

      //定义委托
        delegate string lookMe(string s);
    
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            //匿名委托
            lookMe lm = delegate(string name) { return "亲爱的 " + name + ",请看着我的眼睛!"; };
    
            //匿名委托调用
            string name1 = "jarod";
            Label1.Text = lm(name1);
        }
    • 泛型委托

    Action<>,Func<>,Predicate<> 其实他们都是委托代理的简写形式,通过他们可以省去定义委托的步骤

    示例

    public static void HellowChinese(string strChinese)  
    {  
        Console.WriteLine("Good morning," + strChinese);  
        Console.ReadLine();  
    }  
      
    Action<string> action = HellowChinese;  
    action("Spring.");  

    其中Action是无返回值的泛型委托,Func是有返回值的泛型委托,Predicate<>是返回bool类型的委托,他们都有多个参数的重载版本

       3.  委托的各种写法

    public delegate int DelegateProcess(int num1, int num2);
    
    //第一种写法
    DelegateProcess process= new DelegateProcess(Multiply);
    
    //第二种写法
    DelegateProcess process= Multiply;
    
    //第三种写法  匿名委托
    DelegateProcess process= delegate(int a,int b)
    {
       return a*b;
    }
    
    //第四种写法 Lamdba表达式
    DelegateProcess process =((int a,int b)=>{return a*b;});
    
    //第五种写法 Action<T>和Func<T>
    Action<int,int> process= ((int a,int b)=>{Console.WriteLine(a * b);});
    Func<int,int,int> process= ((int a,int b)=>{return a*b;});
  • 相关阅读:
    重温数据结构与算法(1) 构建自己的时间测试类
    读<<CLR via C#>>总结(11) 详谈事件
    读<<CLR via C#>>总结(13) 详谈泛型
    重温数据结构与算法(2) 编程中最常用,最通用的数据结构数组和ArrayList
    由String类的Split方法所遇到的两个问题
    读<<CLR via C#>>总结(6) 详谈实例构造器和类型构造器
    让我们都建立自己的知识树吧
    读<<CLR via C#>>总结(5) 如何合理使用类型的可见性和成员的可访问性来定义类
    读<<CLR via C#>>总结(10) 详谈委托
    读<<CLR via C#>>总结(4) 值类型的装箱和拆箱
  • 原文地址:https://www.cnblogs.com/leicao/p/5251090.html
Copyright © 2011-2022 走看看