发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
在C#中,所有的Type都是从Object派生而来,也就是说一切Type皆Object。如果,再抽象一个层次,可以把函数也看成Object,可以用函数名+参数+返回值来标识这个函数对象。
把函数看成Object后,自然可以把函数作为成员、变量来用,甚至可以作为另一个函数的参数值、返回值!在C/C++中,用函数指针来实现这个功能。在C#中,为了类型安全,回避了指针。幸运的是,在C#中,有在语义上等价于函数指针的delegate类型。一个delegate实例可以引用一个函数。一旦把一个函数赋值给一个delegate,该delegate看起来就像是那个函数的替身。由此可见,不同语言仅仅用不同的语法阐述了相同的思想!《重构》一书中,有"封装字段"这个重构,这是一个非常简单、非常朴素、一点都不花哨的重构。但是,背后的思想非常深厚、深远、深邃。在C#中有Property来实现这个重构。没有它的话,我们可能要多写几行GetXXX()、SetXXX()了。如果,那个Field不是普通的字段,恰恰是个函数字段(即delegate实例)咋办?难道函数字段就能暴露了吗?!既然,你已经接受了它,就要好好对待它,千万别虐待它!同样,在C#中有event来实现。没有它的话,我们就又要多写几行AddXXX()、RemoveXXX()了!当你写下:
public event EventHandler MyEvent;
private EventHandler _myEvent;public event EventHandler MyEvent{ add { lock (this) { _myEvent += value; } } remove { lock (this) { _myEvent -= value; } }}
相信,大家对event存在性的疑虑已经消除!另外,很多人疑惑"为啥只有+=、-=,而没有="。程序员很像木匠、瓦匠、漆匠、铁匠……,都是靠手艺吃饭的。在长期的劳动中,有些善于思考师傅就总结出一些经验。《重构》一书,就是马师傅总结出来的。他认为,要"封装集合",因为有好处!假设,event支持=,如果一个年少无知的client,到你那里=了一下,你好不容易挂到的2个太阳3个月亮1个星星就没了
来自: coding > 《我的图书馆》
0条评论
发表
请遵守用户 评论公约
C#中的delegate和event
C#中的delegate和event.MyDelegate myDelegate = new MyDelegate(someConcreteFunc);public event MyDelegate myEvent;我只好自己来总结,首先这两个不是同一个层次的概念,委托(这里指delegate)是与cl...
disruptor - 并发编程框架
EventHandler<MyEvent> handler1 = new EventHandler<MyEvent>() {public void onEvent(MyEvent event, boolean endOfBatch) throws Exception {System.out.println("MyEvent=" ...
我对.NET中delegate和event区别的理解
前几天和朋友老邓讨论delegate和event区别的时候,老邓问我对他们的理解,当时自己没理解清楚,只是很简单的一句话:event就是特殊的delegate,也即event是delegate的子集。Synchronized)]public void ...
.net的事件与委托(转载)
Delegatedelegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:1.声明一个delegate对象,它应当与你想要传递...
Java反射实现.NET委托
/** 存取委托函数信息 */ private Map<Object,Method> methodMap; /** * 存储方法参数类型,避免函数重载,调用有误 * 在.NET的委托中,函数类型不同是委托不成功的(也就是参数列表一致,返回...
OpenLayers项目分析——(十)事件机制分析-睁眼瞎看-3sNews.Ne...
OpenLayers项目分析——(十)事件机制分析 - 睁眼瞎 看 - 3sNews.Ne...initialize: function (object, element, eventTypes, fallThrough) {然后initialize将所有的浏览器事件放入listeners中,并为其...
c++仿C# event
//构造函数。就是给MyClass定义了一个事件(通过event关键字),其事件处理函数(通知函数)的原型由EventHandler函数代理(类似C++中的函数指针)指定。//定义EventHandler的函数指针类型。2、将MyCla...
委托和事件的综合总结
就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。你看,整个函数指针变量的申明格式如同函数MyFun的申明处一样,只不过——我们把MyFun改成...
【 】【转帖】谈C#中的Delegate
【 】【转帖】谈C#中的Delegate 【转帖】谈C#中的Delegate谈C#中的Delegate引言。下面我稍微解释一下:【1】public delegate void ...
微信扫码,在手机上查看选中内容