相信大家在面试的时候会经常问到事件和委托的区别,为什么.net中需要事件和委托这样类似的问题吧,对于一些初学者来说可平时用的过程中也不知道为什么, 只知道这样用,而对于其中的实现机制不是很清楚, 所以面试的时候总是感觉回答的不是很有底气的, 对于委托和事件园子里面也有很多人写过这样的文章,比如张子阳博客中C# 中的委托和事件, 这篇文章由浅入深讲解了.net中的事件和委托。所以比较建议初学者看看的,而且很容易懂.(本人第一次写,如果什么地方说错了的地方请大家海涵和及时纠正我)

在张子阳的文章我相信已经把事件和委托讲的很清楚了,下面我说说我感觉需要注意的地方。

为什么会有委托

在C++中用函数指针来实现回调函数(回调函数是一种非常有用的编程机制),然而函数指针不是类型安全的, 所以.net Framework提供了称为委托的类型安全的机制来实现函数的回调。

编译器如何解析委托

当我们像下面一样在代码中定义一个委托时,

Public delegate void Comparator(int value);

但是编译器遇到这行代码会定义一个类:

 Public class Comparator:System.MulticastDelegate
{
public Comparator(Object object, IntPtr method); public virtual Void Invoke(Int32 value); public virtual IAsyncResult BeginInvoke(Int32 vlaue, AsyncCallback callback, Object object ); public virtual void EndInvoke(IAsyncResult result); }

从上面代码可以知道 委托 也是一个类,其中有一个构造器,Invoke方法,BeginInvoke方法 和EndInvoke方法。构造器有两个参数,对象引用传给构造器的Object参数,方法的引用传给method 参数,对于静态方法,会为Object 参数传递null.

事件

先看一个事件的定义:

  //定义事件委托(代理)
public delegate void Comparator(int value1,int value2);
//定义事件
public event Comparator onComparator;

编译器在编译事件的时候会把它转换为三个构造:

        private Comparator onComparator = null;

        public void add_onComparator(Comparator value)
{
// 以一种线程安全的方式对事件添加一个委托
}
public void remove_onComparator(Comparator value)
{
// 以一种线程安全的方式对事件移出一个委托
}

从上面代码可以看出第一部分是申明一个私有的委托字段, 后面两部分是对这个委托字段的add访问器和remove 访问器,我们知道属性中有get 和set 访问器,其实事件就是委托字段的访问器,只是访问器方法用add 和remove,而属性用get和set.

总结:

到这里我要讲的差不多说完了, 这是我第一次写文章,尽管上面的内容理解的不是很深入,但是我只是想通过这样的方式来巩固自己看到的知识,因为我觉得这样可以记录下我不同时段对知识的理解以及写的时候自己也在不断思考,这样会有利于对知识的理解。

最后我为初学者推荐关于深入理解.net  Framework几本书, 因为我感觉很多初学者不知道买什么书来学习。

  1. CLR via C# (第三版) 作者:Jeffrey Richter (周靖译) 清华大学出版社
  2. 深入理解C#(第2版)作者:Jon Skeet  周靖(译)人民邮电出版社

现在关于C# 方面的书籍很多,所以对于一些初学者来说不知道怎么选择, 我推荐上面两本书,如果认真的看完的话, 我相信你肯定对.net 会有一定的理解, 然后通过项目实践的方式对书中内容进行巩固。个人觉得要深入理解程序底层的东西, 有必要阅读一些关于操作系统和编译器相关的书籍,本人一向提倡“知其然知其所以然”的学习方式。

在此推荐一本操作系统相关的书籍: 深入理解计算机系统   (美)布莱恩特,奥哈拉伦 著 龚奕利,雷迎春 译 机械工业出版社。

希望这篇文章对大家会有帮助。

C# 事件和委托的更多相关文章

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

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

  2. c#事件与委托

    C#.net 目录(?)[-] 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托事件与Observer设计模式 范例说明 Observer设计模式简介 实现范例的Obse ...

  3. 《C#高级编程》学习笔记------C#中的事件和委托

    本文转载自张子阳 目录 委托的作用 将方法绑定到委托 事件的来由 Observer设计模式 .Net Framework中的委托与事件   引言 委托 和 事件在 .Net Framework中的应用 ...

  4. 事件、委托、委托方法的总结(使用EventHandler<>)

    在C#中,定义事件.委托.委托方法可以使用类库内的EventHandler泛型委托来定义事件.并根据该泛型委托定义实现方法: 同样您也可以自定义委托 来定义事件以及 根据自定义的委托来定义实现事件的方 ...

  5. C#基础精华07(委托事件,委托的使用,匿名方法)

    1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){  } √ void M2(string s){  } √ ...

  6. [C#参考]事件和委托的关系

    前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别. 事件和委托很相似,事件就好像是被简化的针对特殊用途的委托.看下面的图: 从这张图中能看到,事件是发布者的一个成员,它不是类型. ...

  7. C#事件与委托的区别

    C#事件与委托的区别 1. 委托 事件是利用委托来定义的,因此先解释委托.委托是一个类,它与其他类如int,string等没有本质区别,int代表的是所有的整形,而string代表的是字符串,委托则代 ...

  8. C#事件与委托详解

    from https://www.cnblogs.com/sjqq/p/6917497.html C#事件与委托详解[精华 多看看] Delegatedelegate是C#中的一种类型,它实际上是一个 ...

  9. C#事件与委托详解【精华 多看看】

    Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...

随机推荐

  1. 在C#中如何读取枚举值的描述属性

    在C#中,有时候我们需要读取枚举值的描述属性,也就是说这个枚举值代表了什么意思.比如本文中枚举值 Chinese ,我们希望知道它代表意思的说明(即“中文”). 有下面的枚举: 1 2 3 4 5 6 ...

  2. 如何实现LBS轨迹回放功能?含多平台实现代码

    本篇文章告诉您,如何实现轨迹回放.并且提供了web端,iOS端,Android端3个平台的轨迹回放代码.拷贝后可以直接使用.另外,文末有小彩蛋,算是开发者的福利. Web端/JavaScript 实现 ...

  3. Reservoir Sampling 蓄水池抽样算法,经典抽样

    随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...

  4. LDAP查询过滤语法(MS)

    http://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters ...

  5. activemq安全设置 设置admin的用户名和密码

    ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件,找到 <bean id="securityConstraint" class="o ...

  6. 【C/C++】随机数问题

    最初问题:从n个数中随机选择m个数(0<=m<=n). 为了便于描述,可以将该问题抽象为:从0-n-1这n个数中随机选择m个数.计算机能够提供的随机数都是伪随机的,我们假设计算机提供的伪随 ...

  7. DataTable 排序

    DataTable newdtb = new DataTable(); newdtb.Columns.Add("Id", typeof(int)); newdtb.Columns. ...

  8. 【LeetCode】257. Binary Tree Paths

    Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...

  9. mediawiki的安装与配置

    apache的配置: 1. 开启php module 查看mods-enabled/php5.load 是否存在,不存在的话, 就从mods-avaliable中复制一个到mods-enabled中. ...

  10. Lua截取utf-8编码的中英文混合字符串

    参考博客:UTF8字符串在lua的截取和字数统计[转载] 需求 按字面个数来截取子字符串 函数(字符串, 开始位置, 截取长度) utf8sub(,) = 好1世界哈 utf8sub(,) = 你好1 ...