匿名方法和Lambda 表达式
Overview
当你使用委托的时候,有时候是否会感觉到略微有些麻烦,尽管委托已经极大的减少了我们的工作量,比如,有一个方法,只需要使用一次,仅仅是传递给委托,我们就要定义一次他,这未免太 “重量级了”。C# 总是很人性化的当然有办法减轻我们的不必要的编码负担了,他们就是:
- 匿名方法 C# 2.0 时 引入的
- Lambda 表达式 C# 3.0 时 引入的
匿名方法
为了减少使用委托时产生额冗余代码,在C# 2.0 的时候,引入了一种非常精简的方法,来创建委托。 他就是
匿名方法。
定义简单的委托
namespace UnderstandDelegate
{
public delegate void SimpleHandler();
}
创建一个Person类使用委托
namespace UnderstandDelegate
{
public class Person
{
public void SimpleMethod(SimpleHandler handler)
{
if (handler != null)
handler.Invoke();
}
}
}
原来的实例化方式
namespace UnderstandDelegate
{
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.SimpleMethod(Simple);
}
public static void Simple()
{
Console.WriteLine("Simple");
}
}
}
这我,我们最开始接触委托的时候,使用的方式,我们需要生命一个方法,将其赋值给委托,有时候该方法仅仅就使用一次,但是我们还是要声明他,太冗余了,并且,方法的名字有时候还是一个非常头痛的事情。
匿名方法的实例化方式
无参数无返回值的形式
person.SimpleMethod(delegate ()
{
Console.WriteLine("匿名方法!");
});
有参数无返回值的形式
//委托
public delegate void Simple2Handler(string value);
//调用
Simple2Handler handler = delegate (string value)
{
Console.WriteLine(value);
};
handler.Invoke("Hello");
有参数有返回值的形式
public delegate string Simple3Handler(string value);
Simple3Handler handler = delegate (string value)
requirement
return "";
};
handler.Invoke("Hello");
有没有感觉到瞬间清爽了很多,我们省略了不必要的方法定义,以为这个方法只使用一次,所以方法名也被省略掉了。哦,不要满足,我们稍后我们还有更简洁的方式。
Lambda 表达式
在 C# 3.0 的时候,引入了更加简洁的方式
Lambda表达式,他将简洁做到了极致。下面我们来看一下更为简洁的方式是什么样的:
Lambda 表达式的语法
(参数....) => {
业务逻辑
return 返回值;
};
这是完整的语法,我们在来看一下,他的更简洁的形式
没有参数没有返回值,只有一行代码的时候
() => 代码;
一个参数,一行代码的形式
x => 代码;
一个参数,一个返回值的形式 , 假设返回值是string类型 , 我们连return 关键字都省略了。
x => "HelloWorld!";
多个参数, 多行代码 一个返回值的形式
(x,y) =>
{
//代码1
//代码2
return 返回值;
};
最终的简化代码
//没有参数没有返回值
SimpleHandler h1 = () => Console.WriteLine("HelloWorld");
//一个参数没有返回值
Simple2Handler h2 = x => Console.WriteLine("HelloWorld");
//一个参数一个返回值
Simple3Handler h3 = x => "HelloWorld";
虽然我们的代码量变的很少,但是最后的代码还是一点都没有变少,最后的编译结果会变成类似下面的这样,只是编译器帮我们将多余的工作都完成了。

结语
本文,所讲的 Lambda表达式,将会在 ORM框架中被广泛的时候,关于ORM框架知识,这了就不在赘述,如果大家有兴趣,可以自己去了解,比如说 Linq 框架和 EF 框架。
匿名方法和Lambda 表达式的更多相关文章
- C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...
- 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- (转)C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- [No0000134]C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- 委托学习总结(二)匿名方法和lambda表达式
之前总结了委托这个困惑着大多初学者的概念,继续来学习匿名方法和lambda表达式 (1)我们之前写了这样一段代码 //自定义一个委托 public delegate int Expression(in ...
- 【转】C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- 匿名方法和Lambda表达式
匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法. 规则: 1.匿名方法中不能使用跳转语句跳至次匿名方法的外部,反之亦然:匿名方法外部的跳转语句也不能跳转到匿名方法的内部: 2.在匿名方法 ...
- c#委托中的匿名方法和lambda表达式
一.一般委托方式 Func<int, int, int> AddMethodHander; public unName() { AddMethodHander += AddMethod; ...
- c#中的委託,匿名方法和lambda表達式
(原博)http://www.cnblogs.com/niyw/archive/2010/10/07/1845232.html 简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我 ...
随机推荐
- 分布式系统登录功能拦截器的实现以及cookie的共享问题(利用cookie实现session在分布式系统的共享)
当我们的网站采用分布式部署系统时,每个子系统拥有自己独立的session,如果不实现session共享,当用户切换系统访问的时候,会不停的提示登录,这对于用户体验是非常不好的.因此对于多个子系统的的访 ...
- python数字前自动补零
>>> '%d' % 23 #输出23 ' >>> '%5d' % 23 #输出的数字前有3个空位,共占5个字符 ' >>> '%05d' % 2 ...
- Python常用模块-时间模块(time&datetime)
Python常用模块-时间模块(time & datetime) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.初始time模块 #!/usr/bin/env pyth ...
- 用yaml来编写配置文件
yaml是一个数据序列化的标准,适用于所有开发语言,最大的特点是可读性好. yaml的一个主要应用方向就是编写配置文件,有非常多的系统和框架采用yaml进行配置. yaml有以下基本规则: 1.大小写 ...
- 什么是HTTP协议
什么是Http协议Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) .它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎 ...
- MySQL异步复制延迟解决
http://www.ttlsa.com/mysql/mysql-5-7-enhanced-multi-thread-salve/
- 使用data:uri上传图片
上传图片的方式有两种,一种是使用传统的html控件的方式,设置form属性为multipart/form-data.这种方式兼容ie6,ie7.另一种方式是使用data:uri,将base64编码从浏 ...
- ie8下jquery改变PNG的opacity出现黑边
复制网上的,没有他们那个类型的博客,所以就直接复制了 这些天在做一个效果,鼠标经过,PNG图片由透明变成不透明,jquery代 码:$(element).animate({"opacity& ...
- 【洛谷P3884 [JLOI2009]】二叉树问题
题目描述 如下图所示的一棵二叉树的深度.宽度及结点间距离分别为: 深度:4 宽度:4(同一层最多结点个数) 结点间距离: ⑧→⑥为8 (3×2+2=8) ⑥→⑦为3 (1×2+1=3) 注:结点间距离 ...
- python的__get__、__set__、__delete__(1)
内容: 描述符引导 摘要 定义和介绍 描述符协议 调用描述符 样例 Properties 函数和 ...