我无法理解委托与事件之间的区别
答案 0 :(得分:12)
假设您的公司有客户,Petunia Dursley。 Petunia是女性,住在#4女贞路。
您可能希望在计算机系统中使用对象 代表您的客户,因此您创建一个具有属性的Customer类,如“姓名“和”地址“和”性别“。也许姓名和地址都是字符串,也许“性别”是一个枚举。
现在,Petunia的地址是一个字符串吗?当然不是。这是一个地址。它是由模型中String 类型的对象表示。因为Petunia这个人有属性,如姓名,地址和性别,你系统中的相应对象也有属性名称,地址和性别。
类中的属性是业务域中事物属性的模型,例如客户的属性。实现该属性的机制的选择基于对构建和使用软件模型的人员最方便的内容。在这种情况下,可能机制是一堆各种类型的字段,这些属性包含访问该字段的代码。那些是实现属性的机制。
事件和代表具有相同的关系。 “事件”是“您希望被告知的事情”的软件表示。委托是实现事件的机制。
可以点击一个按钮;这是关于按钮的事实。这个事实是通过“点击”事件在软件中建模的。单击该按钮时,机制会通知感兴趣的各方已发生点击事件的是委托。
总结:事件和属性用于表示类型的业务域中的概念。字段(通常)是属性用于执行其工作的机制,而委托是(始终)事件用于执行其工作的机制。
这是清楚的吗?
答案 1 :(得分:5)
这是Jon Skeet的一个非常好的解释:http://csharpindepth.com/Articles/Chapter2/Events.aspx
答案 2 :(得分:2)
事件是代理人的访问者。就像一个属性是一个字段的访问者。属性具有 get 和 set 访问者,事件具有添加,删除和 raise < / em>访问者。与属性不同,您不必显式编写这些访问器,编译器会为它们生成默认实现。这通常足够好。
答案 3 :(得分:1)
从概念上讲,委托是对对象实例上的方法的引用,允许它从对象本身切断并在代码中传递而不知道其包含的实例。
事件是“观察者”模式的内置实现,其中“广播”对象告诉“侦听”对象他们正在等待发生的事情。在.NET中,支持多个方法引用(MultiCastDelegate)的特殊委托用于实现此功能。这不是唯一可以做到的方式;事件可以使用轮询机制(“拉”方法)代替代表(“推”心态)。
因此,委托是构建事件之类工具的基本构建块。事件是代表的一种用途;其他常见用途包括回调(在异步设计模式中广泛使用)和lambda语句(在.NET中作为匿名委托实现)。