概述

、委托是一个特殊的类,是对同一类方法的抽象

、委托是一种安全性非常高的引用类型,它可以定义一个签名,并且只能存储与签名相匹配的方法的引用(签名包含:返回类型、参数列表)

、委托定义了方法的类型,可以将方法作为参数传递给其他方法

、实例化委托,需要关联一个方法,方法作为参数传递给构造函数(方法只写名称,传递引用,不用加 () ,加 () 是方法的调用)

、所有委托都派生自 System.Delegate 类

、委托用于实现事件和回调方法

定义:修饰符 delegate 返回类型 委托名 (参数列表);

示例:public delegate string DelegateTest (string s);

实例化:委托名 变量名 = new 委托名 (方法名);

4个示例

、DelegateTest del = new DelegateTest (MethodTest);

、DelegateTest del = delegate (string s) { 方法体 }; (匿名方法)

、 DelegateTest del = s => { 方法体 }; (lambda 表达式)

、DelegateTest del = MethodTest; (委托推断)

委托推断:实例化时,直接传入方法名称,编译器会自动根据委托类型进行验证

3个内置委托

Action:无返回值,输入参数至少 0 个,至多 16 个,类型皆为逆变,无输出参数

Func:有返回值,输入参数至少 0 个,至多 16 个,类型皆为逆变,输出参数只有 1 个,类型与返回值类型相同

Predicate:是 Func 的一个特例,返回 Bool 类型的返回值,必须有 1 个输入参数

逆变:是指能够使用,与原类型相比,派生程度更小的类型(大变小:Object > String)

协变:是指能够使用,与原类型相比,派生程度更大的类型(小变大:String > Object)

多播委托(Multicasting Delegate)

概述

、使用 + 运算符,可以将多个类型相同的委托合并到一个委托列表中,即多播委托

、使用 += 运算符,可以将多个方法绑定到一个委托对象,即多播委托

、使用 - 运算符,可以将委托对象从多播委托中删除

、使用 -= 运算符,可以将方法从多播委托中删除

、调用多播委托时,按顺序连续调用所有的方法

2个示例

DelegateTest del1 = new DelegateTest (MethodTest1);

DelegateTest del2 = new DelegateTest (MethodTest2);

DelegateTest del3 = del1 + del2;

DelegateTest del4 = del3 - del1;


DelegateTest del = MethodTest1;

del += MethodTest2;

del -= MethodTest2;