谈谈: 事件和委托

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

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

为何会有委托

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

编译器如何解析委托

当咱们像下面同样在代码中定义一个委托时,编程

Public delegate void Comparator(int value);安全

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

 

View Code
 1 Public class Comparator:System.MulticastDelegate
 2 {
 3         public Comparator(Object object, IntPtr method);
 4 
 5         public virtual Void Invoke(Int32 value);
 6  
 7         public virtual IAsyncResult BeginInvoke(Int32 vlaue, AsyncCallback callback, Object object );
 8  
 9          public virtual void EndInvoke(IAsyncResult result);
10 
11 }

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

 

事件

先看一个事件的定义:学习

 

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

 

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

复制代码
        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 会有必定的理解, 而后经过项目实践的方式对书中内容进行巩固。我的以为要深刻理解程序底层的东西, 有必要阅读一些关于操做系统和编译器相关的书籍,本人一贯提倡“知其然知其因此然”的学习方式。

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

但愿这篇文章对你们会有帮助。

相关文章
相关标签/搜索