C#委托

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

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

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

定义委托

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 action = HellowChinese;
action(“Spring.”);

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

  1. 委托的各种写法

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和Func
Action<int,int> process= ((int a,int b)=>{Console.WriteLine(a * b);});
Func<int,int,int> process= ((int a,int b)=>{return a*b;});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值