其实在上一篇委托(一)中,创建委托还是太繁琐了点。代码量过多,可能会妨碍我们对代码和逻辑的理解。有些时候可能处理逻辑的代码都笔声明委托的代码要少,这就不可避免的增加了重复代码的量。所以在c#2中极大的简化了这种方法,在C#3中也出现了Lambda表达式来解决这种问题。我们先看一下最开始的的委托。

private void Form1_Load(object sender, EventArgs e)
{
button1.Click += new EventHandler(LogPlainEvent);
button1.KeyPress += new KeyPressEventHandler(LogKeyEvent);
button1.MouseClick += new MouseEventHandler(LogMouseEvent);
} static void LogPlainEvent(object sender, EventArgs e)
{
Console.WriteLine("LogPlain!");
} static void LogKeyEvent(object sender, KeyPressEventArgs e)
{
Console.WriteLine("LogKey");
} static void LogMouseEvent(object sender, MouseEventArgs e)
{
Console.WriteLine("LogMouse");
}

在winform中添加如下的代码,其实就是给按钮添加点击事件,press事件和鼠标连续点击事件。

我们在订阅事件的时候,都需要是使用new KeyPerssEvetHandler(LogKey),但c#2支持从方法组到兼容委托的一个隐试转化。其实方法组就是直接使用方法名而已。

            button1.Click += LogPlainEvent;
button1.KeyPress += LogKeyEvent;
button1.MouseClick += LogMouseEvent;

这样的话就不需要每次都实例化一个委托实例。简化了一部分的代码。

匿名函数

当然做一件非常小的事,但也必须创建一个完整的委托,代码量的上升和对智能提示的干扰也是不能让开发人员集中精力在业务逻辑上的重要原因。所以在c#2.0中引入了匿名函数的概念。就是为了解决这个情况。

首先还是来看看匿名函数用于委托的基本语法吧。

Action<string> printReverse = new Action<string>(delegate(string text)
{
char[] chars = text.ToCharArray();
Array.Reverse(chars);
Console.WriteLine(new String(chars));
}); printReverse("shaoqi");

其实就是编译器在IL的语言里面生成了一个创建了一个委托。这样有些重复的代码编译器就替你做好了。可以让你的精力集中在代码的逻辑上面。

Lambda表达式

然后在C#3.0中出项了Lambda表达式,在一定程度上可以看作是匿名函数的一种演变。Lambda比匿名函数感觉的易读和紧凑。需要注意的一点是Lambda表达式本身并不是委托的类型,但可以通过隐式转换的方式转换成一个委托。然后来看看Lambda表的演变。

            Func<string, int> returnLength;
returnLength = delegate(string text) { return text.Length; };
returnLength = (string text) => { return text.Length; }; returnLength = (string text) => text.Length; returnLength = (text) => text.Length;//隐式推断出 returnLength = text => text.Length;

第一个是通过匿名函数创建委托。第二个就是lambda创建的委托。

下一次会写关于LINQ和表达树的知识。自己总结一下。

C#之委托(二)的更多相关文章

  1. 03.C#委托(二章1.1)

    一章1.5-1.8介绍的是com.动态类型及.NET平台一些说明,每个心中都有自己的标准,听一家之言,叫人不爽,相信自己有自己的标准和自己的编程理念就OK了,也不想码那么多说明性的文字,直接跳过吧,当 ...

  2. C#委托,事件,匿名委托

    作为一个初学者,写下来是当做自己的学习笔记,希望在以后遇到问题的时候能够快速的找到方法 如果能帮助跟我一样的新人是更好不过的了        如果有什么不正确或者可以改进的地方也希望大家能够指出来  ...

  3. C#基础之------委托

    一.委托的基本介绍 可以任务委托是持有一个或多个方法的对象.当然,正常情况下你不会去执行一个对象,但是委托与对象不同.可以执行委托,这是委托就会执行他所"持有"的方法. 举个栗子就 ...

  4. Java 的 委托 是什么?

    前言:在学习设计模式时,发现书中有多次提到委托二字,所以经过网上搜索得到结果,并自己写了个小小的例子. 什么是委托? 委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求 ...

  5. C#-9 委托

    一 什么是委托 可以认为委托是持有一个或多个方法的对象.可以执行委托,执行时委托会执行它所持有的方法. 从C++的角度理解,委托可以看成一个类型安全.面向对象的C++函数指针. delegate vo ...

  6. C#的委托

    之前本人一直在写一些相对比较基础的C#代码,现在做了一段时间项目了,遇到更麻烦的问题,比如今天要讨论的委托和事件,这个算是C#进阶篇的内容吧.现在自己就把这些天所学习的和自己所理解的和大家分享.有错请 ...

  7. WebService 学习总结

    一.概念 Web Web应用程序 Web服务( Web Serivce), SOAP, WSDL, UDDI .Net 框架 ASP.net IIS C#, 代理(委托) 二.实践 1.创建WebSe ...

  8. 设计线程安全的类 VS 发布线程安全的对象

    一.设计线程安全的类 步骤: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 1.在现有的线程安全类中添加功能 (1)重用能减低工作量和提高正确性 (2)如果底层 ...

  9. 解密jQuery事件核心 - 委托设计(二)

    第一篇 http://www.cnblogs.com/aaronjs/p/3444874.html 从上章就能得出几个信息: 事件信息都存储在数据缓存中 对于没有特殊事件特有监听方法和普通事件都用ad ...

  10. C#基础系列——委托和设计模式(二)

    前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性 ...

随机推荐

  1. python Rabbitmq编程(一)

    python Rabbitmq编程(一) 实现最简单的队列通信 send端 #!/usr/bin/env python import pika credentials = pika.PlainCred ...

  2. Java基础学习(2)

    Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...

  3. easyuUI实现客户分页显示逻辑分析

    页面 前端 前端easyUI,自带分页功能,添加pagination属性 前端会传给后端两个属性: page:当前页码 rows:每页显示记录数 后端 接收page和rows参数 根据参数分页查询 获 ...

  4. note 2019.12.16

    1.无序 HTML 列表: <ul> <li>Coffee</li> <li>Tea</li> <li>Milk</li& ...

  5. Oracle 与 ODAC 一起安装

    Oracle 需要设置path变量支持运行,ODAC安装时会将其路径加入path变量. 导致先搜索到ODAC,连接出现:ora-12560: TNS:protocol adapter error 将p ...

  6. 舞蹈课(dancingLessons)

    有n个人参加一个舞蹈课.每个人的舞蹈技术由整数ai来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果相差最小的不止一对,那么 ...

  7. 又联考了一场,感觉自己好菜啊,T1没写出来,后来花了一个早上调试。QAQ。最后发现是个-1还有取模没打。。。TAT。。。难受极了!!!

    简单的区间(interval) 题目描述: 样例输入: 样例1: 4 3 1 2 3 4 样例2: 4 2 4 4 7 4 样例输出: 样例1: 3 样例2: 6 提示: 时间限制:1000ms 空间 ...

  8. 【FJ省队训练&&NOIP夏令营】酱油&&滚粗记

    FJOI2016省队训练滚粗记 2016.07.03~2016.07.06(Day1~5) 在学校期末考.因为才省选二试too young too simple爆蛋了所以下半个学期只能滚回去读文化课, ...

  9. 【bzoj2821】作诗(Poetize)

    *题目描述: 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅 ...

  10. Are We Ready for SDN? Implementation Challenges for Software-Defined Networks

    Name of article:Are We Ready for SDN?  Implementation Challenges for  Software-Defined Networks Orig ...