C# 事件和委托
相信大家在面试的时候会经常问到事件和委托的区别,为什么.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几本书, 因为我感觉很多初学者不知道买什么书来学习。
- CLR via C# (第三版) 作者:Jeffrey Richter (周靖译) 清华大学出版社
- 深入理解C#(第2版)作者:Jon Skeet 周靖(译)人民邮电出版社
现在关于C# 方面的书籍很多,所以对于一些初学者来说不知道怎么选择, 我推荐上面两本书,如果认真的看完的话, 我相信你肯定对.net 会有一定的理解, 然后通过项目实践的方式对书中内容进行巩固。个人觉得要深入理解程序底层的东西, 有必要阅读一些关于操作系统和编译器相关的书籍,本人一向提倡“知其然知其所以然”的学习方式。
在此推荐一本操作系统相关的书籍: 深入理解计算机系统 (美)布莱恩特,奥哈拉伦 著 龚奕利,雷迎春 译 机械工业出版社。
希望这篇文章对大家会有帮助。
C# 事件和委托的更多相关文章
- 解密jQuery事件核心 - 委托设计(二)
第一篇 http://www.cnblogs.com/aaronjs/p/3444874.html 从上章就能得出几个信息: 事件信息都存储在数据缓存中 对于没有特殊事件特有监听方法和普通事件都用ad ...
- c#事件与委托
C#.net 目录(?)[-] 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托事件与Observer设计模式 范例说明 Observer设计模式简介 实现范例的Obse ...
- 《C#高级编程》学习笔记------C#中的事件和委托
本文转载自张子阳 目录 委托的作用 将方法绑定到委托 事件的来由 Observer设计模式 .Net Framework中的委托与事件 引言 委托 和 事件在 .Net Framework中的应用 ...
- 事件、委托、委托方法的总结(使用EventHandler<>)
在C#中,定义事件.委托.委托方法可以使用类库内的EventHandler泛型委托来定义事件.并根据该泛型委托定义实现方法: 同样您也可以自定义委托 来定义事件以及 根据自定义的委托来定义实现事件的方 ...
- C#基础精华07(委托事件,委托的使用,匿名方法)
1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){ } √ void M2(string s){ } √ ...
- [C#参考]事件和委托的关系
前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别. 事件和委托很相似,事件就好像是被简化的针对特殊用途的委托.看下面的图: 从这张图中能看到,事件是发布者的一个成员,它不是类型. ...
- C#事件与委托的区别
C#事件与委托的区别 1. 委托 事件是利用委托来定义的,因此先解释委托.委托是一个类,它与其他类如int,string等没有本质区别,int代表的是所有的整形,而string代表的是字符串,委托则代 ...
- C#事件与委托详解
from https://www.cnblogs.com/sjqq/p/6917497.html C#事件与委托详解[精华 多看看] Delegatedelegate是C#中的一种类型,它实际上是一个 ...
- C#事件与委托详解【精华 多看看】
Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...
随机推荐
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...
- javascript设计模式与开发实践阅读笔记(4)——单例模式
定义 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 具体来说,就是保证有些对象有且只有一个,比如线程池.全局缓存.浏览器中的window 对象等.在js中单例模式用途很广,比如登录 ...
- sqlserver内存释放心得
SQL Server 2008 或者R2的默认内存分配是2147483647MB, 差不多算是无穷大,对于系统内存的管理策略是有多少占多少.SQLserver会把所有处理过的SQL操作缓存在内存里,这 ...
- 线程与并发系列一:Lock、Monitor、UserSpinLock
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- android studio 乱码
1. 设置 file- setting -file encodeing- 设置utf-8 2 . build.gradle 添加 tasks.withType(JavaCompile) { opti ...
- ReactiveCocoa与Functional Reactive Programming
转自 http://blog.leezhong.com/ios/2013/06/19/frp-reactivecocoa.html Functional Reactive Programming(以下 ...
- 【linux】vim编辑器vim+taglist+ctags的配置
很多linux软件开发实际上并不实在X window的情况下进行的,这时我们不可能启动基于X window的图形化窗口,在这一情况下我们所能使用的主要的编辑器是vim和emacs.(ps:emacs和 ...
- JS 获取自定义标签
<abc-aaa xwe='sdf'>AAAAAAAAAAAAAAAAAAAAAA</abc-aaa> alert($("abc-aaa").attr(&q ...
- web开发中的 emmet 效率提升工具
web开发中的 emmet 效率提升工具 可以用来快速生成html 代码. 并且给各种IDE.编辑器提供了插件支持,sublime ,webstorm等. 如在webstorm中安装好emmet之后, ...
- 如何修改 EM12c 中 SYSMAN 用户的密码?
以下内容全部转自:http://www.chenjunlu.com/2013/04/how-to-modify-the-password-for-sysman-of-em-12c-cloud-cont ...