谈谈我对委托、Lambda表达式、匿名类、事件的理解
委托定义:委托是封装方法的引用类型,类似于C中的指针
委托类型表示形式相同的方法。
委托实例能引用形式相同而名称不同的多个方法。
委托实例的加减运算:
1、一个委托实例可同时引用多个形式相同的方法。
2、通过对委托实例进行加法运算或加赋值运算(+或+=),能够令委托实例引用多个方法
3、反之,也可对委托实例进行减法运算或减赋值运算(-或-=),以移除其引用的方法
4、委托实例加、减运算的一般形式如下:
委托变量+=方法名或委托实例
委托变量=委托实例+委托实例
委托变量-=方法名或委托实例
委托变量=委托实例-委托实例
5、调用引用多个方法的委托实例,将按顺序逐个调用各方法
委托主要事件处理,事件类型就是委托。
委托类型的基类是delegate类,使用delegate声明委托
委托3步走(骤):
一、delegate声明委托:可选public等delegate方法返回类型,委托类型名(方法形参列表)
1、委托类型的实例是方法,委托类型的声明与方法形式密切相关,声明时要指明方法返回类型,方法形参列表等,但无须指明方法名称。
2、只能声明委托类型,不能定义委托体。
eg:delegate long MyDelegate(int i,int j);
public delegate void MyDelegate2();
public delegate double MyDelegate3(double x,double y);
3、委托类型声明通常与类的声明并列,也可在类内部声明委托类型。
二、实例化委托:使用委托类型声明变量并赋予委托对象(方法名)
*委托类型名 委托变量;
*委托变量=new 构造函数名(方法名)
1、构造函数与委托类型名相同
2、还可把方法名称直接赋值给委托变量,语法形式:委托变量=方法名;
3、相当于构建委托实例
4、也可像其他类型那样,变量声明与变量赋值合二为一:
委托类型名 委托变量=new 构造函数名(方法名); 或: 委托类型名 委托变量=方法名;
eg,方法:public static long Add(int i,int j){ return(i+j);}
则:MyDelegate operate=new MyDelegate(Add); 或:MyDelegate operate=Add;
5、委托变量可被重新赋值,eg:operate=Multiply;
三、调用委托:调用实例化后的委托,执行对应的方法
1、实例化委托后便可调用,调用委托即是调用其引用的方法
2、调用委托:用委托实例(或实例化的委托变量名)替代方法名。eg:long product=operate(30,40);
3、相当于通过委托来调用方法Multiply(30,40)
4、调用委托的一般语法形式:委托实例(方法实参列表)
Lambda运算符、表达式及语句
1、=>称作Lambda运算符,读为goes to
2、包含=>的表达式就是Lambda表达式。语法形式:(输入参数表)=>表达式或语句块
3、Lambda把表达式的运算结果:是Lambda体的执行结果
4、运算符=>右边是语句块的也称Lambda语句
5、Lambda表达式的一些例子:
(x)=>x*x 或 x=>x*x
x=>{return x*x;}
(x,y)=>x>y
(int x,string s)=>s.length>x
(double x,double y)=>{return x+y;}
()=>{return 88;}
6、只有一个输入参数的,输入参数表可省略圆括号。
7、输入参数类型可显示/不显示指定
8、Lambda表达式相当于匿名方法,返回类型根据上下文得出
9、Lambda表达式的可用于创建委托实例
委托使用Lambda表达式注意事项:
1、Lambda表达式的参数数量必须与委托类型的参数数量相同
2、Lambda表达式中的每个输入参数都必须能隐式转换为对应的委托参数
3、Lambda表达式的如果有返回值,必须能隐式转换为委托的返回类型
4、Lambda表达式本身没有显示指定类型,其"类型"是委托的方法返回类型或Lambda体表达式的类型
5、Lambda表达式除了创建委托,还广泛用于以方法语法表示的语言集成查询linq中
使用delegate声明匿名方法
1、使用delegate声明匿名方法,形式:delegate(形参表){方法体语句}
2、形参表为空,可省略圆括号,变成没有参数的匿名方法:delegate{方法体语句}
3、匿名方法一般作为委托实例,赋给委托类型变量
事件:
1、事件是基于委托模型的,事件的类型是委托,事件使用委托来封装处理方法。事件包括3个方面:
(1)、事件发送方(类):事件源、发行者(sender)
(2)、事件接收方(类):响应、处理事件的对象,事件订户
(3)、事件委托(类型):事件发送方和接收方的媒介
2、事件是以类(或结构)成员出现。声明事件语法形式:可选的public等event委托类型名、事件变量;
3、事件变量实例化,语法形式:事件变量+=方法或委托实例;
4、可多次使用+=,使一个事件变量关联多个方法或委托实例
5、移除事件变量关联的方法或委托实例,语法形式:事件变量-=方法或委托实例
事件的特点:
1、事件只能由事件发行类本身引发,事件订户可通过调用事件发行者的方法以确定何时引发事件
2、事件订户要确定执行何种操作来响应事件
3、一个事件可以有多个事件订户,一个事件订户可处理多个发行者事件
4、没有订户的事件不会被引发调用
5、若一个事件关联多个方法,引发事件时,会同时调用多个方法
6、事件一般用于通知用户操作,如:图形用户界面中的按钮单击或菜单选择等
关于事件的概念:
1、订阅事件:在事件订户类中把方法添加到事件变量中
2、取消订阅事件:从事件变量中移除方法
3、多路广播:同时调用一个事件引用的多个方法。
WPF用户界面事件:
1、WPF等图形用户界面程序,广泛运用了事件,如:
(1)、button类派生于buttonbase,拥有click事件
(2)、click事件类型是委托类型RoutedEventHandler
2、委托类型有2个参数:发行者sender,路由事件参数e
3、使用按钮click事件:双击它,自动生成click事件处理方法
4、自动生成隐藏在obj\Debug\Window1.g.cs
小结:
1、委托是一种引用类型,委托的根是Delegate类,只能使用关键字delegate声明委托类型
2、有了委托类型,便可声明委托变量,创建委托实例并赋给委托变量。创建委托实例实质上就是构建委托对象,委托实例是一个或多个具体的方法。
3、委托变量通过方法名引用具体的方法,也可引用相当于匿名方法的Lambda表达式
4、还可用关键字delegate声明匿名方法,作为委托的实例,赋给委托变量
5、事件作为类或结构的一种成员,声明事件变量时要是有关键字event,事件的类型是委托,因此声明事件变量必须用到委托类型
6、委托与事件属于高级编程范围,在VS开发环境中编写WPF等图形用户界面程序,能自动生成事件处理方法名、以及订阅事件代码。编程者只需要编写事件处理方法体内的逻辑代码就可以了。