C#学习笔记之十三
委托派生于System.MulticastDelegate类,该类又派生于System.Delegate;委托是一个能够引用方法的对象;程序运行时同一个委托能够调用不同的方法,委托调用的方法不是在编译时确定的,而是在程序执行时确定的;
声明委托:delegate ret-type name(parameter-list);ret-type是委托将调用的方法的返回值类型,name是委托的了名称,parameter-list指定委托调用的方法所需的参数;
创建委托,使用new关键字;其构造函数只有一个参数,即添加到该委托中的第一个方法。常用格式如下:AClass ac1=new AClass(abc);和AClass ac1=abc;其中AClass表示实例化类的名称,abc表示要引用的构造函数;
委托的作用就是来传递方法的;
多播委托是指允许创建方法的调用列表或链表的能力;调用时这些方法会自动执行,如果委托具有返回值,将列表中最后一个方法的返回值用作整个委托调用的返回值;方法链表的创建:实例化一个委托,使用“+”或“+=”运算符为链表添加方法;移除时可以使用“-”或“-=”;
逆变指的是函数引用的每个参数的类型必须与委托对应参数的类型相同,或者是委托的对应参数的派生类型;协变指的是委托的返回类型必须与函数引用的返回类型相同或者是函数引用的返回类型的派生类型;
事件构建在委托的基础上,事件必须是一个委托,声明如下:event delegateTypName eventName;
订阅事件使用“+=”:eventname+=delegatename;
取消订阅事件“-=”:eventname-=delegatename;
引发事件:可以把一个事件当做方法来调用,从而引发这个时间,引发事件后订阅该事件的方法会被依次调用;
匿名函数是传递给委托构造函数的未命名代码块。优点是可以简化代码,可以通过委托调用,避免创建单独的方法;格式:声明的委托 ac=delegate{……};代码块末尾要用“;”结束;可以给匿名方法传递参数,格式如下:声明的委托 ac=delegate(参数列表){……};的委托;匿名方法可以使用return返回值;
Lambda表达式是创建匿名函数的另一种方式;它是能返回一个方法的表达式;运算符“=>”(转到或称为);格式:参数=>表达式或(参数列表,,)=>表达式;Lambda表达式可以使用多种形式:
Lambda表达式的形式 说明 x=>x*x 返回参数值的平方 x=>{return x*x;} 返回参数值的平方,主体是语句块 (int x)=>x/2 返回参数值除以2的结果 {}=>folder.StopFolding(0) 调用一个方法,表达式不获取参数,表达式不一定返回值 (x,y)=>{x++;return x/y;} 多个参数,编译器自己推导参数类型,x是以值的形式传递的 (ref int x,y){x++;return x/y;} 多个参数,都指定了参数类型,x是以引用的形式传递的 语句Lambda扩展了Lambda表达式中可以处理的操作类型;