• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 理解C#中的Lambda表达式

理解C#中的Lambda表达式

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#lambda表达式,c#中lambda表达式,c#lambda表达式 嵌套,c#lambda,c#中lambda等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

先来看两段代码:
 Thread t = new Thread(() =>
{
AddIt AddDelegate = new AddIt(AddItem);
this.Invoke(AddDelegate);
});

Thread t3 = new Thread(new ThreadStart(() =>
{
AddIt AddDelegate = new AddIt(AddItem);
this.Invoke(AddDelegate);
}));
</div>
 
这两种写法都是可以的,出来的IL也一样,但是意义是不同的,后者相当于匿名方法,前者

更像是"匿名"的委托,其实这样写:
Thread t2 = new Thread(() =>
{
this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); }));
});
</div>
这个跟上面两种写法也是一样的效果,初次接触的时候,可能大家跟我一样会有些迷茫,Lamdba表达式到底该怎么用呢?

首先还是要弄清Lamdba表达式的几个特性:

1. Lamdba 表达式是一个委托类型:
  MethodInvoker invoker = () => { Console.WriteLine(); };
//is actually equal to the following form.
  MethodInvoker invoker = delegate() { Console.WriteLine(); };
//这里是Lamdba 表达式的匿名委托的用法
</div>
2. Lamdba 表达式可以用作匿名方法
  MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//相当于:
  MethodInvoker invoker = new MethodInvoker(MyFunc);
  partial void MyFunc()
  {
    Console.WriteLine();
  }
  </div>

我们知道, 当构造一个新的委托的时候, 他的构造器需要一个函数指针作参数,这个函数指针是委托类型的
实际上,当我们这样去new 一个委托的时候:
  MethodInvoker invoker = new MethodInvoker(MyFunc);
  </div>
"MyFunc" 就是一个委托,而不只是一个函数名的存在. 编译器将为这个构造函数生成一个匿名委托:
  MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
  </div>
可以这样理解编译器的行为: 匿名方法其实也就是委托。

那么为什么我们可以这么写呢:
  MethodInvoker invoker = () => { Console.WriteLine(); };
  </div>
我们来看一看:
首先,这个委托的构造器需要一个委托参数,所以通常我们得这样写:
  MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
</div>
但是匿名的delegate 可以转化成函数指针 (void() target):
 所以这样写是可以的:
 MethodInvoker invoker = new MethodInvoker(MyFunc);
//而匿名的委托又可以描述为Lambda表达式
  MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
</div>
//另外一方面,由于编译器对"宽松委托"的支持, MethodInvoker类委托可以转化成匿名类委托:
  MethodInvoker invoker = delegate() { Console.WriteLine(); };
//而匿名的委托又可以用Lambda表达式来描述
  MethodInvoker invoker = () => { Console.WriteLine(); };
</div>
从上面,我们可以看到一个复杂的委托是如何转化成简洁的Lambda表达式的。这对程序员来说无疑又是提高生产力的一个体现!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#中方法的直接调用、反射调用与Lambda表达式调用对比
  • 理解C#中的Lambda表达式
  • 初步认识C#中的Lambda表达式和匿名方法
  • C#特性之匿名方法和Lambda表达式
  • C#中使用Lambda表达式自定义比较器实现两个列表合并实例
  • C#基础之Lambda表达式用法实例教程
  • C#3.0中Lambda表达式详解
  • C# 中如何利用lambda实现委托事件的挂接
  • C#用Lambda和委托实现模板方法

相关文章

  • 2017-05-28javascript函数中执行c#函数的方法
  • 2017-05-28c#连接mysql数据库的方法
  • 2017-05-28c# 代理模式
  • 2017-05-28C#遍历文件夹及子目录下所有图片
  • 2017-05-28C#文件后缀名的详细介绍
  • 2017-05-28如何使用C#读写锁ReaderWriterLockSlim
  • 2017-05-28C# WINFORM 强制让窗体获得焦点的方法代码
  • 2017-05-28C#编程实现对象与JSON串互相转换实例分析
  • 2017-05-28C#实现类似jQuery的方法连缀功能
  • 2017-05-28C#同步、异步远程下载文件实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#进行文件读写、创建、复制、移动、删除的方法
    • word ppt excel文档转换成pdf的C#实现代码
    • C#求n个数中最大值和最小值的方法
    • C# WinForm窗体编程中处理数字的正确操作方法
    • C#简单查询SQLite数据库是否存在数据的方法
    • C#字符串的截取函数用法总结
    • C#向word文档插入新段落及隐藏段落的方法
    • linq语法基础使用示例
    • 用C#把文件转换为XML的代码
    • C#验证码识别类完整实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有