其实在上一篇委托(一)中,创建委托还是太繁琐了点。代码量过多,可能会妨碍我们对代码和逻辑的理解。有些时候可能处理逻辑的代码都笔声明委托的代码要少,这就不可避免的增加了重复代码的量。所以在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. Linux学习--第一天--Unix 、 Linux 发展史,Linux应用领域

    UNIX发展史 肯·汤姆森开发出linux. 肯·汤姆森的同事丹尼斯·里奇在1971年开发了C语言. 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP PA-RISC Sol ...

  2. Ansible 管理Windows 受控端

       

  3. 初学oracle第三天

    体系结构 Oracle 采取的是 Client/Server 架构. 3.1 Client   3.1.1 Sqlplus 这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具. 我们可以配 ...

  4. wepy-wxss报错

    慢慢积攒下wepy 的一些BUG吧 1.页面在page目录下明明删除了某个子页面文件,打开wepy却一直报错!wxml报错或者wxss报错,提示的页面我为了排错都直接delete掉了,还是报错???思 ...

  5. CDMA原理

    CDMA原理——特点 CDMA具有抗多径干扰.抗窄带干扰.抗认为干扰.抗多径延迟扩展的能力.同时有提高蜂窝系统的通信容量和便于模拟与数字体制的共存与过渡等优点.与TDMA技术形成强劲的竞争力. 与FD ...

  6. zrender笔记----(数字Number组件)出现的问题和解决办法

    1.期望的效果是这样子的(这也是最终结果): 2.开始是用json假数据,开始没考虑null的问题,导致在判断传值处,判断有误. 导致在对接接口时,凌乱了,后来修改了下变成后面图C的逻辑,json数据 ...

  7. bullet学习日记

    最近需要bullet用物理引擎做一个测量类的项目,因为半途接手,物理部分其实已经实现,但犹于对bullet基本不了解,导致相关部分完全改不动,这两天静下心来把物理引擎用法了解了一翻,顺便做点笔记,以便 ...

  8. 弹性盒子FlexBox简介(二)

    弹性盒子属性 一.align-content属性 属性作用:用于修改flex-wrap属性行为.类似于justify-content,但它不是设置弹性子元素的对齐,而是设置各个行的对齐. 属性值: f ...

  9. React native 平时积累笔记

    常用插件: react-native-check-box 复选框react-native-sortable-listview 列表拖拽排序 react-native-doc-viewer 预览组件 r ...

  10. BZOJ 5129: [Lydsy1712月赛]树上传送 点分树+Dijkstra

    Description http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf Input Output 暑假集训的时候点分树做的比较少,所 ...