委托概述

1.概念

委托太常见了,能灵活运用可以使你在编程中游刃有余。
简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度更小	的“接口”(约束了指向方法的签名)

2.简单使用

一个委托类型定义了该类型的实例能调用的一类方法,这些方法含有同样的返回类型和同样参数(类型和个数相同)。
委托和接口一样,可以定义在类的外部。
如下定义了一个委托类型 
delegate int Calculator (int x);
此委托适用于任何有着int返回类型和一个int类型参数的方法,如:
static int Double (int x) { return x * 2; }
创建一个委托实例,将该此方法赋值给该委托实例:
Calculator c = new Calculator(Double);
也可以简写成:
Calculator c = Double;
这个方法可以通过委托调用:
int result = c(2);	

3.用委托实现插件式编程

我们可以利用“委托是一个能把方法作为参数传递的对象”这一特点,来实现一种插件式编程。
例如,我们有一个Utility类,这个类实现一个通用方法(Calculate),用来执行任何有一个整型参数和整型返回值的方法

示例代码如下:

    delegate int Calculator(int x);

    class MyProgram
    {
        static int Double(int x) { return x * 2; }
        static void Main(string[] args)
        {
            int[] values = { 1, 2, 3, 4 };
            Utility.Calculate(values, Double);
            foreach (int i in values)
                Console.Write(i + " ");  

            Console.ReadKey();
        }
    }


    class Utility
    {
        public static void Calculate(int[] values, Calculator c)
        {
            for (int i = 0; i < values.Length; i++)
                values[i] = c(values[i]);
        }
}

4.多播委托

所有的委托实例都有多播的功能。
所谓多播,就像一群程序员在瞬聘网填好了求职意向后,某天有个公司发布了一个和这些程序员求职意向刚好相匹				配的工作,然后这些求职者都被通知了 - “有一份好工作招人啦,你们可以直接申请去上班了!”。
也就是说,一个委托实例不仅可以指向一个方法,还可以指向多个方法

5.静态方法与实例方法对于委托的区别

当一个类的实例的方法被赋给一个委托对象时,在上下文中不仅要维护这个方法,还要维护这个方法所在的实例。
System.Delegate 类的Target属性指向的就是这个实例

6.泛型委托

如果你知道泛型,那么就很容易理解泛型委托,说白了就是含有泛型参数的委托,
例如:
public delegate T Calculator<T> (T arg);

7.Func 和 Action 委托

有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action。如下所示(下面的in表示参数,out表示返回结果):
delegate TResult Func <out TResult> ();delegate TResult Func <in T, out TResult> (T arg);delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2); ... 一直到 T16
delegate void Action ();delegate void Action <in T> (T arg);delegate void Action <in T1, in T2> (T1 	arg1, T2 arg2); ... 一直到 T16

8.委托兼容

委托的类型兼容
参数类型兼容
返回值类型兼容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值