您的位置:首页 > 其它

.NET教程 Lambda 表达式的简介及形成过程

2015-04-08 08:58 337 查看
C#的Lambda表达式是一种"语法糖",使用
Lambda 运算符 =>,该运算符读为“goes to”。语法如下:
形参列表=>函数体

函数体多于一条语句的可用大括号括起。

要了解Lambda表达式,首先就要了解什么是委托,委托(delegate)是一种引用类型.简单讲,委托就是一个函数指针.先看一个例子

//声明一个委托

public delegate int DelegateAdd(int a, int b);

public class A

{

//静态的处理方法

public static int Add(int a, int b)

{

return a + b + 3;;

}

}

//入口类

public class B

{

public static void Main()

{

//实例一个委托

DelegateAdd mdh = new DelegateAdd(A.Add);

//调用委托

int sum = mdh(2, 2);

Console.WriteLine(sum.ToString());

}

}

上面是一个非常简单的例子,具体的实现步骤:

1、 先声明个委托实例 ;

2、然后提供要处理的方法;

3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象

4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。

5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致
,否则会出现错误。

以上实例

IT经典笑语录:有一个小伙子在一个办公大楼的门口抽着烟,一个妇女路过他身边,并对他说,“你知道不知道这个东西会危害你的健康?我是说,你有没有注意到香烟盒上的那个警告(Warning)?” 小伙子说,“没事儿,我是一个程序员”。 那妇女说,“这又怎样?” 程序员说,“我们从来不关心Warning,只关心Error”
定义了一个A.Add()的方法.但是还有一种方法,就是先不定义,在实例化委托的时候,直接定义一个匿名方法.则以上实例变成了以下代码

public delegate int DelegateAdd(int a, int b);

//入口类

public class B

{

public static void Main()

{

//实例一个委托的同时,定义了一个匿名方法

DelegateAdd mdh = new DelegateAdd(delegate(int a,int b){return a+b+3;});

//调用委托

int sum = mdh(2, 2);

Console.WriteLine(sum.ToString());

}

}

以上方法就是做了一步的改进,使用了匿名方法,就不用在外部在定义方法了.

进一步的优化以下语句:

DelegateAdd mdh =
new DelegateAdd(delegate(int a,int b){return a+b+3;});

1) 省略了 new DelegateAdd

DelegateAdd mdh =
delegate(int a,int b){return a+b+3;};

2) 省略了关键字 delegate,并加上符号 =>

DelegateAdd mdh =
(int a,int b)=>{return a+b+3;};

3) 省略参数类型

DelegateAdd mdh =
(a,b)=>{return a+b+3;};

4) 省略可以省略的括号,return 等,最终形成Lambda表达式

DelegateAdd mdh =
(a,b)=>a+b+3;

再举个系统常用的委托:Func<T,TResult>. 如下:

1)new Func<string,int>(delegate(string
str){return str.length;})

2)delegate(string
str){return str.length;}

3)(string str)=>{return
str.length;}

4)(string str)=>str.length;

5)(str)=>str.length;

6)str=>str.length;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: