Use the Delegate Or Event ?

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最初接触委托(Delegate)与事件(Event)时,始终对两者应用上不能做出较好的区分。只是事件自身是借助于委托实现的,那么如果委托足以应对大多数的需求,那么为什么引入事件呢?(Why Events)这样想来似乎陷入了“既生瑜,何生亮”的慨叹中...暂且打住,看看具体的事例情况吧:

    

// 发布事件的Clock类 Clock.cs

 

 

// 依赖于Clock并将订阅其事件的TimeBoard类 TimeBoard.cs

 

// 依赖Clock,也将订阅其事件的TimeWriter类 TimeWriter.cs

 

// 进行测试的主函数部分 Program.cs

 

(注意被注释掉的没有加上event 关键字声明的那一行) 如果只是应用delegate,对应看到Main函数中,当TimeWriter对象注册事件时,一旦误用了赋值操作符"=",而不是"+="添加方法到事件链中时会使在这之前已经注册的方法变成无效(被擦除了?),而这并非我们操作的本意。但以event 关键字进行声明后,编译器能自动检测出此处的误用,这正是event体现出的更好的封装性。

  

另外值得注意的一点是,如果最后Main函数中(最后一行的代码)clock似乎绕到了后方,开始直接调用自身对外公开的delegate,同时传入虚假的参数试图触发整个调用链。同样如果应用event代替delegate进行处理,此处的非法调用会被C#编译器侦查到,报告错误信息,提示调用出错。而这一点正是保证了委托所封装的方法只在发布事件的那一端得到触发时才真正被调用,隔绝了从外部调用的可能性。

 

最后以它们各自想表达的话语作结吧  :-)

Delegate 告诉另外的一个类“执行这个操作,做完后这个通知我”。Event 在一旁也说了“没有这么简单,我负责的这个delegate所封装的方法是专为个人处理而使用的:可以订阅/退订,而不可以直接调用”。

  

C#中委托(delegate)与事件(event)的快速理解 具有返回值的委托类型,返回值默认是最后一个函数的返回值,就是最后添加的返回值。 阅读详情

相关推荐

关于unity 使用delegateevent 小例子

本人属于水平不高的,看了项目中使用的delegateevent,拿来分享一下。 网上关于delegateevent的例子已经非常非常多了,讲解的一定比我详细,但是有时时间紧迫没时间仔细研究想拿来直接用可以看看我这个小例子。

bill501y的专栏 7082

详细探讨delegate(委托)和event(事件)(2)

delegate(2)   上一篇我们看了委托的概念和例子,相信很多人都会想,委托是怎么实现的?VS自带的工具ILDASM,可以查看一个exe或者dll文件的IL代码,具体方法是进入Visual Studio Tools 下的 Visual Studio Command Prompt命令行,输入ILDASM就能看到一个可视化的界面,执行File-->Open,可以选择一个exe文件,比如...

Beatles_The的专栏 313

c# 关键字delegateevent(委托与事件)[MSDN原文摘录][1]

A delegate is a type that safely encapsulates a method, similar to a function pointer in C and C++. Unlike C function pointers, delegates are object-oriented, type safe, and secure. The type of a de...

weixin_30795127的博客 192

DelegateEvent (委托和事件)

Delegate|委托 怎样理解委托呢,具体的定义可以在MSDN 找到。形象一点讲,就是...比如你,叫张三,别人一叫(call)张三,你就会回答“诶,叫我什么事”(程序调用然后输出). 就像程序调用一样,一call 一答。现在你张三被提拔为了总经理,人称张经理。于是别人一叫(call)张经理,你就回答“诶,叫我什么事”。并且张经理还有名片,可以到处发放(比如多线程里通过委托安排方法的执行顺

jiqiang_paul的专栏 470

delegateevent

经过查阅资料和自己的理解整理出来的,欢迎大家指教。 delegateevent 何时使用: 异步的时候,比如加载完成通知。 需要回调的时候,比如按钮点击、动画播放结束等。 发送事件通知的时候。 比如,功能触发。 使用观察者模式的时候。比如,2个类之间的交互。 2者的区别: event其实是对delegate的扩展。 event在interf...

baixuchu7236的博客 218

不得不明白的vb.net Delegate-只供入门

Event Delegate 在好多地方多看到了,比如在学习web user control 的时侯,还有vb.net remoting object 的时候。 我看了不少文章后,也不是很明白。我在这里写下来,主要是为了我自己以后的回故。同时,也想让大家参考。 要理解event delegate, 当然要先明白什么是event. 其实简单的想,就是"回叫"的机制,她解决一个依赖的问题。 比如真...

weixin_33785972的博客 1650

C# Event浅析

Event浅析前言一、Event是什么?二、Event定义1. .Net 提供的定义EventHandler2.自定义委托三、Event调用 前言 Event事件机制是C#的重要特性,它可以实现诸如点击功能,多线程应用等多个场景中。 一、Event是什么? Event本质是基于delegate实现的,是delegate 的一种实现。采用订阅者/发布者机制,订阅者即事件接收方,发布者为事件发布方。事件定义在发布者中,当发布者调用某种方法时,事件即触发,订阅者收到被触发事件,即调用相应方法。 二、Event

CSharpIsDog的博客 774

jQuery源码分析--event事件绑定(上)

上文提到,jquery的事件绑定有bind(),delegate()和one()以及live()方式。我用的jQuery2.1.3版本,live()已经被废弃了。bind(),delegate()和one()的内部源码。//7491行 bind: function( types, data, fn ) { return this.on( types, null, data, fn )

章鱼小丸子 9902

使用event来处理用户控件之间的通讯

User Control之间的通讯有很多种方法。比较简单的是利用session,cookie,viewstate,url parameter,javascript,访问子控件的属性等。但这些方案不是很elegance,容易出错且修改不便。我们可以利用delegateevent来很好地解决这样的问题。比如有一个aspx文件,包含了2个user control,分别是uc1和uc2。在u

空空的世界 871

c# event(事件)和delegate(委托)

事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂。而这些东西却往往又是编程中常用且非常重要的东西。大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来。 先来看看事件编程有哪些好处。 在以往我们编写这类程序中,往往采用等待机制,为了等

GAMELOFT9----纸上得来终觉浅,绝知此事要躬行 1220

delegate vs event

delegate可以说是一个很能代表C#语言优雅品味的关键字,在event使用场景中好像直接使用delegate也没什么问题,那么Anders Hejlsberg为什么还要再引入一个event关键字呢?

西北偏北再偏北 331

DELEGATE AND EVENT

DelegateIntroductionAs a variable can be declared as a pointer so can a function. A pointer to a function is a type of variable whose name can be used as a variable although it is not a traditiona

xiao_gosun的专栏 480

C#委托(delegate)与事件(event

C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。简单的讲委托(delegate)是一种类型安全的函数指针.           仅仅看它的概念,可能还是很模糊,我们来举例子由浅入深地说明一下。(强烈提醒:注意代码中的一些关键注释。代码完全可以复制下来直接运行。)

一名系统架构师的征途 3430

.net 事件委托 java_C#委托(delegate)与事件(event

C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。简单的讲委托(delegate)是一种类型安全的函数指针.仅仅看它的概念,可能还是很模糊,我们来举例子由浅入深地说明一下。(强烈提醒:注意代码中的一些关键注释。代码完全可以复制下来直接运行。)需求:《收费系统》计费标准:会员1元/小时;临...

weixin_42515841的博客 333

vb.net Delegate-入门级

<br />Event Delegate 在好多地方多看到了,比如在学习web user control 的时侯,还有vb.net remoting object 的时候。<br />我看了不少文章后,也不是很明白。我在这里写下来,主要是为了我自己以后的回故。同时,也想让大家参考。<br />要理解event delegate, 当然要先明白什么是event. 其实简单的想,就是"回叫"的机制,她解决一个依赖的问题。 比如真实世界里你的经理让你算算今年的税款。 想象一下,你的经理他每隔5分钟会打电话给你,问

水族杰纶 9011

About Delegate and Event

Just some information, if it is wrong, please correct me. Thank you wait...   Delegate, is used in c sharp, like the feature on "function pointer" in c++. One friend tell me that is "delegate" is

marryshi的专栏 401
上一篇: 关于Visual Studio .NET 2003 安装时“系统组件不匹配”问题的解决
performance1024
博客等级 码龄20年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值