.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;
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;
相关文章推荐
- Lambda 表达式的简介及形成过程
- VBS教程:正则表达式简介 -后向引用
- VBS教程:正则表达式简介 -普通字符
- .Net - Lambda 表达式
- .Net开发必备十大工具详解之查询表达式(LINQ)简介
- .net正则表达式 用法(基于过程和基于表达式方法的比较)
- 微软的正则表达式教程(一):正则表达式简介
- C#教程:作为委托的Lambda表达式
- .NET 3.x新特性之Lambda表达式
- VBS教程:正则表达式简介 -建立正则表达式
- C++0x尝鲜:用lambda表达式模拟Ruby的过程对象
- VBS教程:正则表达式简介 -特殊字符
- VBS教程:正则表达式简介 -选择与编组
- VBS教程:正则表达式简介
- 消息队列(Message Queue)简介及其使用-.NET教程
- 微软的正则表达式教程(一):正则表达式简介
- VBS教程:正则表达式简介 -正则表达式语法
- VBS教程:正则表达式简介 -早期起源
- VBS教程:正则表达式简介 -非打印字符
- .net 正则表达式 30分钟入门教程