概述
、委托是一个特殊的类,是对同一类方法的抽象
、委托是一种安全性非常高的引用类型,它可以定义一个签名,并且只能存储与签名相匹配的方法的引用(签名包含:返回类型、参数列表)
、委托定义了方法的类型,可以将方法作为参数传递给其他方法
、实例化委托,需要关联一个方法,方法作为参数传递给构造函数(方法只写名称,传递引用,不用加 () ,加 () 是方法的调用)
、所有委托都派生自 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;