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

    1.同步 同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级 如图,如果变量没有volatile关键字,那么A线程对该变量的改变存储在内存A,B变量不 ...

  2. Java并发——原子变量和原子操作

    很多情况下我们只是需要一个简单的.高效的.线程安全的递增递减方案.注意,这里有三个条件:简单,意味着程序员尽可能少的操作底层或者实现起来要比较容易:高效意味着耗用资源要少,程序处理速度要快:线程安全也 ...

  3. Codeforces Round #569 (Div. 2) 题解A - Alex and a Rhombus+B - Nick and Array+C - Valeriy and Dequ+D - Tolik and His Uncle

    A. Alex and a Rhombus time limit per test1 second memory limit per test256 megabytes inputstandard i ...

  4. TFServering和docker

    nvidia-docker安装:https://github.com/NVIDIA/nvidia-docker nvidia-docker的基本操作:https://blog.csdn.net/pan ...

  5. Django【第26篇】:中介模型以及优化查询以及CBV模式

    中介模型以及优化查询以及CBV模式 一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' t ...

  6. OCP内容

    安装 --网络 --存储 --用户 --对象 --ASM (包含前面的内容的复习)--内存管理 -- 备份 --闪回 -- 事务 --sql 编程

  7. sql优化-派生表与inner-join

    首先来说明一下派生表? 外部的表查询的结果集是从子查询中生成的.如下形式: select ... from (select ....) dt 如上形式中括号中的查询的结果作为外面select语句的查询 ...

  8. Centos 6.4 x86_64 最小化安装后的优化——还需要整理

      Centos 6.4 x86_64 最小化安装后的优化   购买了服务器以后要做的第一件事就是安装操作系统了,这里推荐安装 Centos 6.4 x86_64,安装系统时要选择最小化安装(不需要图 ...

  9. linux运维、架构之路-MySQL备份与恢复(四)

    一.备份方式 ①逻辑备份(文件表示:SQL语句) ②物理备份(数据文件的二进制副本) ③基于快照的备份 ④基于复制的备份 二.备份工具 ①mysqldump:原生自带的逻辑备份工具 ②mysqlbin ...

  10. Win10 设置系统时间