委托
目录
什么是委托
可以认为委托是持有一个或多个方法的对象。
委托和类一样,是一种用户自定义的类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定操作。 可以通过一下擦欧总来使用委托:
可以把delegate 看作一个包含有序方法列表的对象,这些方法具有相同的前名和返回类型
声明委托类型
委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型的对象之前声明。
返回类型和签名指定了委托接受的方法的形式
委托类型的声明:
以 delegate 关键字开头
没有方法主体
创建委托对象
委托是引用对象,因此有引用和对象
两种创建委托对象的方法:
写的方法名后面不需要跟()
除了为委托分配内存,创建委托对象还会把第一个方法放入委托的调用列表
给委托赋值
由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收
组合委托
委托可以使用额外的运算符来”组合“,这个运算最终会创建一个新的委托,其调用列表连接了作为操作数的两个委托的调用列表副本
委托是恒定的,委托对象被创建后就不能再被改变
为委托添加方法
’ += ‘ 看起来就可以为委托添加方法的语法
从委托移除方法
’ -= ‘
与为委托增加方法一样,其实是创建了一个新的委托。新的委托是旧委托的副本--只是没有了已经被移除方法的引用
调用委托
使用参数调用委托就会使用相同的参数值调用它的调用列表中的每一个成员
如果一个方法在调用列表中出现多次,当委托被调用时,每次在列表中遇到这个方法时它都会被调用一次
委托的示例
- using System;
- using System.Collections.Generic;
- using System.Text;
-
- namespace Csharpzuoye
- {
- delegate void PrintFunction();
-
- class Test
- {
- public void Print1()
- {
- Console.WriteLine("Print1 -- instance");
- }
- public static void Print2()
- {
- Console.WriteLine("Print2 -- static");
- }
- }
-
- class Program
- {
- static void Main()
- {
- Test t = new Test();
- PrintFunction pf;
-
- pf = t.Print1;
- pf += Test.Print2;
- pf += t.Print1;
- pf += Test.Print2;
-
- if (pf != null)
- pf();
- else
- Console.WriteLine("Delegate is empty");
- }
- }
- }
调用带返回值的委托
调用带引用参数的委托
如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变
在调用委托列表中的下一个方法时,参数的新值(不是初始值)会传给下一个方法
匿名方法
如果方法只会被使用一次-- 在这种情况下,除了创建委托的语法需要,没有必要创建独立的具名方法。匿名方法允许我们避免使用独立的具名方法
匿名方法(anonymous method):是在初始化委托时内联(inline)声明的方法
使用匿名方法
声明委托变量时作为初始化表达式
组合委托时在赋值语句的右边
为委托增加事件时在赋值语句的右边
匿名方法的语法
返回类型
参数
params参数
变量和参数的作用域
参数以及声明在匿名方法内部的局部变量的作用域限制在实现方法的主体之内
外部变量
与委托的具名方法不同,匿名方法可以访问它们外围作用域的局部变量和环境
捕获变量的生命周期的扩展
只要捕获方法还是委托的一部分,即使变量已经离开了作用域,捕获的外部变量也会一直有效
Lambda 表达式
简化匿名方法表达式
编译器可以通过推断允许我们更进一步简化Lambda表达式,如下:
- using System;
- using System.Collections.Generic;
- using System.Text;
-
- namespace Csharpzuoye
- {
- delegate double MyDel(int par);
-
- class Program
- {
- static void Main()
- {
- MyDel del = delegate (int x) { return x + 1;};
-
- MyDel del1 = (int x) => { return x + 1; };
- MyDel del2 = (x) => { return x + 1; };
- MyDel del3 = x => { return x + 1; };
- MyDel del4 = x => x + 1;
-
- Console.WriteLine("{0}",del(12));
- Console.WriteLine("{0}", del1(12));
- Console.WriteLine("{0}", del2(12));
- Console.WriteLine("{0}", del3(12));
- Console.WriteLine("{0}", del4(12));
- }
- }
- }
有关Lambda表达式的参数列表要点如下: