9yue7
委托 delegate
一、委托的概念
把方法作为一个参数来传递(方法是变化的)
二、声明委托
访问修饰符 delegate 返回值类型 委托类型名 (参数列表);
委托也是一种引用类型,和类一样,需要我们自己来定义
定义时委托类型的返回值和参数与要引用的方法的返回值和参数一致,
二者在外形上一样,只是委托用delegate修饰.
三、使用委托
委托三个步骤:1、委托声明,
GreetingDelegate greetingDelegate;
2、委托实例化 ,
greetingDelegate = Test_1;
3、委托调用
greetingDelegate();也可以这样写
也可以这样写:
// GreetingDelegate greetingDelegate = new GreetingDelegate (Test_1);
注:
委托类似于函数指针,但与函数指针不同的是,委托是面向对象的、类型安全的和保险的。
委托既能引用静态方法,也能引用实例方法。
委托要绑定的方法 参数、返回值必须一样;
四、委托的定义
委托是一个类,它定义了方法的类型,使得可以将方法当做另一方法的参数来进行传递,也即是方法的参数是一个委托变量,
在调用此方法时,就可以把一个方法做为参数传递给委托变量;
合并委托(多播)
调用一个委托就要调用委托的所有方法
委托可以+ - 绑定和解除绑定,多播委托包含已分配委托的列表。
在调用多播委托时,它会按照顺序调用委托方法,只能合并相同类型的委托
注:
当委托绑定多个有返回值的方法时,其结果是最后绑定的那个方法的返回值,
前面绑定方法的返回值会被最后绑定方法的返回值所覆盖,所以使用委托时一般不带返回值.
总结:
一、委托和所引用的方法必须保持一致
1、参数 (个数、类型、顺序)必须完全一致
2、返回值类型必须一致
二、一个委托被同时映射到静态方法和实例方法,并分别返回特定的信息;
四种形式的委托
两种写法(格式):
匿名(在方法只用一次,不用专门写出方法时),Lamda
两种系统定义的委托类型:
(方便于不用再定义变量)
Func要有返回值,Action没有返回值。
委托传入的值是根据方法来定的
一、匿名委托
用法:委托变量在绑定方法时,是把方法名赋值给了委托变量名,
这样就需要在类里面定义方法,而有些方法只用到了一次,
这样的方法在类里面过多时,程序的可读性就不是太好,
针对这种情况,可以使用匿名委托,即不用在类里面额外定义方法.
格式:delegate(参数){要执行的代码};
参数:相当于绑定方法的参数
{};里面相当于绑定方法的方法体
由于是赋值,是一个语句,后面的;不要省
二、Iamda表达式
格式:(参数)=>{要执行的代码};
参数:相当于绑定方法的参数
{};里面相当于绑定方法的方法体
由于是赋值,是一个语句,后面的;不要省
三、Func 委托
使用Func泛型,前面两个是参数类型,最后一个是返回值类型,
其变量可以绑定匿名委托,lambda表达式和相同类型的方法,
此种委托一定会有返回值;
四、Action委托
格式
使用Action泛型,<>里面的类型是参数的类型,
该种委托可以绑定匿名委托,lambda表达式和方法,
但其一定没有返回值