C#笔记——lambda表达式(委托->匿名方法->lambda表达式)

一、委托

1.基本知识

  • 声明委托的方式:delegate  返回值类型   委托类型名(参数)  

  eg:delegate void StringProcess(string s);

  注意:这里除了前面的delegate,剩下的部分和声明一个函数一样,但是StringProgress不是函数名,而是委托类型名。

  • 声明的委托是一种类型,就像int,Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProgress f1;
  • 将委托变量指向函数SayHello。StringProgress sp = new StringProgress(SayHello),就可以像调用普通函数一样把sp当成函数用。即:委托类型实例化的对象是函数~! 委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托可以指向任意的函数,哪怕是之前没定义的都可以,而不受限于哪几种。为匿名函数铺垫~~
  • 将委托类型变量指向函数还可以简化成StringProgress sp = SayHello,编译器帮我们进行了new,但是不能sp = Printit();这是调用函数,“执行Print函数,并且将sp指向PrintIt的返回值”

2.委托的组合

  delegate void ProgressWordDelegate(string s)//一个ProgressWordDelegate委托

  ProgressWordDelegate d = new  ProgressWordDelegate(SayHello) + new ProgressWordDelegate(ToLower)

  • 委托的组合必须是同一个类型
  • 相当于创建了一个按照组合的顺序依次调用的新委托对象
  • 委托的组合一般是给事件用的,用普通的委托的时候很少用

二、匿名方法

  使用Delegate的时候很多时候没必要使用一个普通方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。允许匿名对象就允许匿名方法。

 

View Code
1 ProcessWordDelegate p = delegate(string s)
2 {
3     Console.WriteLine(s);
4 };

 

委托类型名  f = delegate(参数列表) {};

其中f指向匿名函数,执行匿名函数的代码。

 

三、lambda表达式(与linq结合力量很强大perfect)

  lambda表达式其实是匿名函数的另一种简化写法。常用于创建委托和表达式目录树类型。lambda表达式的标志运算符  => 读作“goesto”。

  ProgressStringDelegate p = (s) => {Console.WrireLine(s);};

  lambda语法详解:s为参数列表,不需要标注类型,因为变量声明中类型已经声明了;只输入一个参数时可以不用(),否则括号是必须的,多个参数中间用逗号隔开。=>后的{}中是方法体。lambda表达式返回方法体的结果。

    通常Lambda表达式的参数都是可变类型的,由编译器自动确定它的具体类型。但有时编译器难于或无法推断输入类型,就需要为参数显示指定类型,即在参数之前添加参数类型。(int x,string s) =>s.Length>x

    当Lambda表达式没有参数时,需要使用空括号表示,其中“()”表示没有参数,而Amethod()是一个具体的方法,该方法的返回值就是Lambda表达式的结果。  ()=>Amethod()

 

 

 

 

posted @ 2012-08-03 16:06  小猪闯天涯  阅读(351)  评论(0编辑  收藏  举报