谈谈我对委托、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等图形用户界面程序,能自动生成事件处理方法名、以及订阅事件代码。编程者只需要编写事件处理方法体内的逻辑代码就可以了。

posted @ 2012-02-29 15:45  Mirtina(天涯流落思无穷)  阅读(201)  评论(0编辑  收藏  举报