13.1 什么是委托
- 委托是持有一个或多个方法的对象,可将一个方法传递到另一个方法。
- 委托是用户自定义的引用类型。
13.2 委托概述
- 类表示的是数据和方法的集合,而委托持有一个或多个方法,以及一系列预定义操作。
- 委托中的方法可以是实例方法,也可以是静态方法。
- 在调用委托的时候,会执行其调用列表中的所有方法。
13.3 声明委托类型
delegate void SayHelloDelegate(string s);//1.以delegate关键字开头 2.后缀添加Delegate,以表明是委托
13.4 创建委托对象
SayHelloDelegate mydelegate1, mydelegate2; mydelegate1 = new SayHelloDelegate(a.CSayHello);//实例化委托对象的方法1 mydelegate2 = a.CSayHello;//实例化委托对象的方法2
13.5 给委托赋值
- 委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收。
13.6 组合委托
SayHelloDelegate mydelegate1, mydelegate2, mydelegate3; mydelegate1 = new SayHelloDelegate(a.CSayHello); mydelegate2 = a.CSayHello; mydelegate3 = mydelegate1 + mydelegate2;//组合委托
13.7 为委托添加方法
SayHelloDelegate mydelegate1; mydelegate1 = new SayHelloDelegate(a.CSayHello); mydelegate1 += a.ESayHello;//使用"+="为委托添加方法
13.8 从委托移除方法
SayHelloDelegate mydelegate1; mydelegate1 = new SayHelloDelegate(a.CSayHello); mydelegate1 += a.ESayHello; mydelegate1 -= a.CSayHello;//使用“-=”从委托移除方法
- 将从调用列表的最后开始搜索,并且移除第一个与方法匹配的实例。
- 试图删除委托中不存在的方法,编译时不会报错。
- 试图调用空委托会抛出异常,如果调用列表为空,则委托是null。
13.9 调用委托
- 在调用委托的时候,会执行其调用列表中的所有方法。
13.10 委托的示例
略。
13.11 调用带返回值的委托
- 调用列表中的最后一个方法返回的值就是委托调用的返回值。
- 调用列表中所有其他方法的返回值都会被忽略。
13.12 调用带引用参数的委托
//声明带有引用参数的委托类型 delegate void MydelDelegate(ref int x); class Program { static void Main(string[] args) { A a = new A(); MydelDelegate myDel = a.Add2; myDel += a.Add3; int x = 5; myDel(ref x);//在调用委托列表的下一个方法时,参数的新值会传给下一个方法。 Console.WriteLine(x);//x输出后,x为10。 } }
class A { public void Add2(ref int x) { x += 2; } public void Add3(ref int x) { x += 3; } }
13.13 匿名方法
- 匿名方法是在初始化委托时内联声明的方法。
- 声明委托变量时作为初始化表达式。
- 组合委托时在赋值语句的右边。
- 为委托增加事件时在赋值语句的右边。
delegate void MydelDelegate(int x); class Program { static void Main(string[] args) { //使用匿名方法,不需要实例化类,调用类的方法。 MydelDelegate myDel = delegate(int x) { x++; }; } }
13.14 Lambda表达式
MydelDelegate myDel1,myDel2,myDel3,myDel4,myDel5; myDel1 = delegate(int x) { x = x + 1; };//匿名方法 myDel2= (int x)=>{ x = x + 1; };//Lambda表达式 myDel3 = (x)=> { x = x + 1; };//Lambda表达式 myDel4 = x=> { x = x + 1; };//Lambda表达式 myDel5 = x => x = x + 1;//Lambda表达式