看了一些资料,简要的总结一下委托,Lambda,事件。

委托。

1)委托的含义

委托定义了函数类型,是一种类似“C++函数指针”的东西。

但委托和函数指针还是不同的,函数指针不过是一个函数的入口地址(指向内存位置的指针),它是类型不安全的;委托不仅包含入口地址,还定义了函数的具体信息,如返回值,输入参数等,它是类型安全的。也就是说,定义一个函数指针后,任何函数都可以赋予该指针,有极大的不安全性;但定义了一个委托后,只有符合该委托定义的函数签名的函数才能赋予该委托,增强的安全性。

总之,在.NET中要传递一个方法,就必须把一个方法的细节(返回值,输入参数)封装在一种新类型的对象中,即委托。所以委托是一种类,如同String定义了字符串对象,委托定义了函数对象。

在使用委托的时候,就像使用一个类一样。使用类时,分为两个阶段:首先定义这个类,然后实例化类的一个对象。委托的大致使用形式如下:

void Method(int a)   //假设有这样一个Method
{
  return a;  
}
delegate void DelegateMethod(int x); //这里定义了一个委托,DelegateMethod相当于String
//将Method函数赋予委托变量myDelegate,类似String myString = new String("abc"),也可以用DelegateMethod myDelegate = Method; 达到同样的效果
DelegateMethod myDelegate = new DelegateMethod(Method); myDelegate(); //等价于Method(5)

2)委托的多播

利用“+=”运算符可以让委托包含多个函数,在使用该委托变量时,会依次调用这些函数。

3)Action<T>和Func<T> 委托

除了使用delegate关键字定义一个新的委托,还可以使用已定义的好的委托。

泛型Action<T>委托表示一个返回值为void,输入参数为T的函数,若想定义2个输入参数的函数,即为Action<T1, T2>泛型Func<T, TResult>委托表示返回值类型为TResult,输入参数为T的函数,同理若想定义多个输入参数,即为Function<T1, T2, T3, TResult>

4)Lambda表达式(入)

前面提到可以使用如下方法给委托变量赋值:

DelegateMethod myDelegate = Method;

而Lambda表达式是另一种给委托赋值的方式。类似一种匿名函数的方式,只要有委托参数类型的地方,就可以使用Lambda表达式:

DelegateMethod myDelegate = a => return a;

上面这句话完成之前赋值方式同样的效果(“a = > return a;” 就相当于Method)。其中a是函数中参数,“=>”后面跟的是函数的具体实现

总之,委托实际是定义函数的类型(如同String是定义字符串的类型),它方便我们将一个函数作为另一个函数的参数传递进去。

事件。

事件就是封装了委托类型的变量,就如同在类中封装string类型时用属性,那封装delegate类型时就用事件。而且统统利用“+=/-=”绑定/解绑函数,利用event关键字:

public event myDelegate makeDelegate;

事件将原来的委托变量myDelegate封装成一个新的委托变量makeDelegate,它总是private,我们就可以这么干了

makeDelegate += GetChineseName;
makeDelegate += GetEnglishName;

注意都是用的“+=”,这样利用语句:

makeDelegate("Yis");

依然会先后调用public void GetChineseName("Yis")和public void GetEnglishName("Yis")两个方法。

先写这么多,以后加深了理解再补充。

C# 委托和Lambda表达式的更多相关文章

  1. 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

    本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...

  2. 转载 C#匿名函数 委托和Lambda表达式

    转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法 ...

  3. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

  4. 委托与Lambda表达式

    ~,先不急说委托和Lambda表达式,先看两个例子再说: 1. 通过委托,为一个数字加10,如下代码: class Program { private delegate int JiSuan(int ...

  5. 系统预定义委托与Lambda表达式

    NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式   开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Fun ...

  6. C#函数式程序设计之函数、委托和Lambda表达式

    C#函数式程序设计之函数.委托和Lambda表达式 C#函数式程序设计之函数.委托和Lambda表达式   相信很多人都听说过函数式编程,提到函数式程序设计,脑海里涌现出来更多的是Lisp.Haske ...

  7. C# Note2:委托(delegate) & Lambda表达式 & 事件(event)

    前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...

  8. 深入学习C#匿名函数、委托、Lambda表达式、表达式树类型——Expression tree types

    匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...

  9. 委托、Lambda表达式、事件系列07,使用EventHandler委托

    谈到事件注册,EventHandler是最常用的. EventHandler是一个委托,接收2个形参.sender是指事件的发起者,e代表事件参数. □ 使用EventHandler实现猜拳游戏 使用 ...

  10. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

随机推荐

  1. python3 开发面试题(生成列表)6.1

    话不多说直接上题: 生成如下列表: [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8], [0, 3, 6, 9, 12]] # 方式一 list1 ...

  2. 修复XAMPP安装过程中 因端口80被占用 Apache无法启动的问题

    Fix XAMPP Apache Not Starting Because Port 80 In Use XAMPP中Apache服务器无法启动,出现该问题的最常见原因是由于默认端口号80可能已被其他 ...

  3. python 爬取36K新闻

    代码如下: from urllib import request url = 'http://36kr.com/api/info-flow/newsflash_columns/newsflashes? ...

  4. 解密所有APP运行过程中的内部逻辑(转)

    转贴地址:http://www.freebuf.com/tools/54562.html 0×01前言 这年头,apk 全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了.静态分析越来越 ...

  5. 一道综合练习题实践list及dictionary集合类

    定义一个员工的集合,对员工集合内的元素进行查询和删除.实现员工的签到和签退,要求如下: //A:每天只能签到一次 //B:签退前必须已经签到 //C:显示打卡记录 代码如下:员工信息类: using ...

  6. vim 代码注释插件

    参考: 1.http://www.vim.org/scripts/script.php?script_id=1218 2.http://www.dutor.net/index.php/2010/05/ ...

  7. iOS 常用的#define合集

    1.定义常量 定义常量的时候最好以小写字母k开头,让人见名知意, (1)导航栏高度:我们都知道iPhone竖屏时候导航栏的高度为44,这时候可以定义一个常量来表示该高度, #define kNaivg ...

  8. 2017年最全的30个Android面试题,你将如何回答?

    百度首页 登录 2017年最全的30个Android面试题,你将如何回答? 机翼技术 百家号 03-10 02:32 “三金四银”又是一年一度的跳槽季,相信有不少Android程序员开始摩拳擦掌蠢蠢欲 ...

  9. JavaScript破解验证码

    现在,Megaupload站点提供的CAPTCHA在上述代码面前已经败下阵来,说实话,这里的验证码设计的不不太好.但更有趣的是: 1.HTML 5中的Canvas应用程序接口getImageData可 ...

  10. 怎么成为PHP专家

    当阅读各种和PHP相关的博客.Quora问题.Google+社区.资讯和杂 志的时候,经常会注意到在技术上出现两极分化的现象.问题均围绕在“我如何连接到一个MySQL数据库?”,或者是“我如何使得邮件 ...