C#之委托(二)
其实在上一篇委托(一)中,创建委托还是太繁琐了点。代码量过多,可能会妨碍我们对代码和逻辑的理解。有些时候可能处理逻辑的代码都笔声明委托的代码要少,这就不可避免的增加了重复代码的量。所以在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#之委托(二)的更多相关文章
- 03.C#委托(二章1.1)
一章1.5-1.8介绍的是com.动态类型及.NET平台一些说明,每个心中都有自己的标准,听一家之言,叫人不爽,相信自己有自己的标准和自己的编程理念就OK了,也不想码那么多说明性的文字,直接跳过吧,当 ...
- C#委托,事件,匿名委托
作为一个初学者,写下来是当做自己的学习笔记,希望在以后遇到问题的时候能够快速的找到方法 如果能帮助跟我一样的新人是更好不过的了 如果有什么不正确或者可以改进的地方也希望大家能够指出来 ...
- C#基础之------委托
一.委托的基本介绍 可以任务委托是持有一个或多个方法的对象.当然,正常情况下你不会去执行一个对象,但是委托与对象不同.可以执行委托,这是委托就会执行他所"持有"的方法. 举个栗子就 ...
- Java 的 委托 是什么?
前言:在学习设计模式时,发现书中有多次提到委托二字,所以经过网上搜索得到结果,并自己写了个小小的例子. 什么是委托? 委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求 ...
- C#-9 委托
一 什么是委托 可以认为委托是持有一个或多个方法的对象.可以执行委托,执行时委托会执行它所持有的方法. 从C++的角度理解,委托可以看成一个类型安全.面向对象的C++函数指针. delegate vo ...
- C#的委托
之前本人一直在写一些相对比较基础的C#代码,现在做了一段时间项目了,遇到更麻烦的问题,比如今天要讨论的委托和事件,这个算是C#进阶篇的内容吧.现在自己就把这些天所学习的和自己所理解的和大家分享.有错请 ...
- WebService 学习总结
一.概念 Web Web应用程序 Web服务( Web Serivce), SOAP, WSDL, UDDI .Net 框架 ASP.net IIS C#, 代理(委托) 二.实践 1.创建WebSe ...
- 设计线程安全的类 VS 发布线程安全的对象
一.设计线程安全的类 步骤: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 1.在现有的线程安全类中添加功能 (1)重用能减低工作量和提高正确性 (2)如果底层 ...
- 解密jQuery事件核心 - 委托设计(二)
第一篇 http://www.cnblogs.com/aaronjs/p/3444874.html 从上章就能得出几个信息: 事件信息都存储在数据缓存中 对于没有特殊事件特有监听方法和普通事件都用ad ...
- C#基础系列——委托和设计模式(二)
前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性 ...
随机推荐
- 使用nginx配置二级域名
使用nginx配置二级域名 2018.11.21 11:51:17字数 613阅读 170 最近想把三个项目配在一个服务器上,于是想使用nginx配置二级域名实现. 1.域名添加解析 我的是阿里云的域 ...
- 四、VLC搭建rtsp服务器
一.VLC搭建rtsp服务器 1.rtsp服务搭建 https://blz-videos.nosdn.127.net/1/OverWatch/AnimatedShots/Overwatch_Anima ...
- C#设置欢迎窗体由不透明变透明
public Form1() { InitializeComponent(); } private bool isForm1 = true; //设 ...
- 02-第一个Python程序
第一个HelloPython程序 1.1Python源程序的基本概念 Python源程序是一个特殊格式的文本文件,可以使用任意文本编辑软件做Python的开发 Python程序的文件扩展名通常都是.p ...
- ifconfig-push
ifconfig-push中的每一对IP地址表示虚拟客户端和服务器的IP端点.它们必须从连续的/30子网网段中获取(这里是/30表示xxx.xxx.xxx.xxx/30,即子网掩码位数为30),以便于 ...
- 通过METAMASK调试和发布智能合约指南(转载)
2017-12-07 芯链团队 小明微思考 原文地址:https://mp.weixin.qq.com/s?__biz=MzA4Mzk2MzUzNg==&mid=2651223347& ...
- git 流程 rebase rename
git流程: git init --bare git checkout -b develop git checkout -b feature1 feature1: git add . git comm ...
- 自学semantic UI个人博客首页模板
以下是代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <m ...
- 并行操作多个序列map
>>> def add1(a): return a + 1 >>> def add2(a,b): return a + b >>> def add ...
- mysql:联合索引及优化
命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 尽量不要用or,如果可以用union代 ...