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 表达式的更多相关文章

  1. C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...

  2. 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  3. (转)C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  4. [No0000134]C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  5. 委托学习总结(二)匿名方法和lambda表达式

    之前总结了委托这个困惑着大多初学者的概念,继续来学习匿名方法和lambda表达式 (1)我们之前写了这样一段代码 //自定义一个委托 public delegate int Expression(in ...

  6. 【转】C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  7. 匿名方法和Lambda表达式

    匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法. 规则: 1.匿名方法中不能使用跳转语句跳至次匿名方法的外部,反之亦然:匿名方法外部的跳转语句也不能跳转到匿名方法的内部: 2.在匿名方法 ...

  8. c#委托中的匿名方法和lambda表达式

    一.一般委托方式 Func<int, int, int> AddMethodHander; public unName() { AddMethodHander += AddMethod; ...

  9. c#中的委託,匿名方法和lambda表達式

    (原博)http://www.cnblogs.com/niyw/archive/2010/10/07/1845232.html 简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我 ...

随机推荐

  1. json字符串转java对象

    今天遇到一个问题,前端ajax获取到一个javaBean对象,好多方法发ajax请求需要把这个对象再传到后端,后端再根据这个对象进行操作(之前计划传递id,但发现传递id的话,后端多个方法都需要根据i ...

  2. 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解

    矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...

  3. Workflow规则收藏

    豆瓣电影  查看电影评分等详细信息 查看图片EXIF 图铃机器人 快递查询 翻译 手机号码归属地 音乐视频下载 获取附近的免费WIFI

  4. python数据库操作 - MySQL入门【转】

    python数据库操作 - MySQL入门 python学院 2017-02-05 16:22 PyMySQL是Python中操作MySQL的模块,和之前使用的MySQLdb模块基本功能一致,PyMy ...

  5. PyCharm 2018实现远程调试代码

    pycharm是一个非常强大的python开发工具,现在很多代码最终在线上跑的环境都是linux,而开发环境可能还是windows下开发,这就需要经常在linux上进行调试,或者在linux对代码进行 ...

  6. ajax调用WebService 不能跨域

    http://www.cnblogs.com/dojo-lzz/p/4265637.html "Access-Control-Allow-Origin":'http://local ...

  7. Java基础91 mysql的用户权限设置问题

    1.概述 1)MySQL数据库中root用户具有最高的权限(超级用户),可以对任何数据库,任何表进行操作. 2)权限账户,只拥有部分权限(CRUD) .例如:只能操作某个数据库的某张表等等. 2.my ...

  8. maven dependencies 报错

    maven配置的环境变量有问题: 用最新的maven替换系统默认的setting.xml文件即可

  9. OI 助手 | 简洁快速的 OI 工具箱 (原 竞赛目录生成)

    原竞赛目录生成 (4.0 版本前) 开发者:abc2237512422 OI 助手是一个轻量简洁的 OI 工具箱.你可以使用它来快速进行 OI 竞赛中一些繁琐的操作,例如生成竞赛目录.对拍.它为你省去 ...

  10. (转)jquery serialize表单序列化,当radio或checkbox 未选中时,没有序列化到对象中的原因分析和解决方案 - ghostsf

    相信很多人都用过jq的表单序列化serialize()方法,因为这能很方便地帮你把表单里所有的非禁用输入控件序列化为 key/value 对象,不需要你再去一个个地拼接参数了. 这是一个很好用的函数, ...