有关事件与委托关系的思考
创始人
2024-06-06 18:11:02
0

事件与委托究竟是什么关系,你了解么?你了解的正确么?这样的基础概念,其实往往是容易造成混淆的地方。下面介绍Ivony对事件与委托关系的思考总结,总结的还是挺不错的。

由于MSDN含混不清的误导,很多人(包括我以前)认为,其实事件就是一种受限的委托。但实际上不是,事件与委托的关系好比字段与属性的关系。事件实际上是一种委托属性,只不过这个属性重载的不是赋值运算符,而是+=和-=运算符。

我们知道,对于一个属性而言,对他的赋值和取值运算会被转换为两个方法的调用。

例如obj.A这个属性,则下面的表达式等同于后面的形式:

  1. obj.A = “aaa”;           obj.set_A( “aaa” );  
  2.  
  3. string a = obj.A;        string a = obj.get_A();  

而事件也是一样,假设有一个事件obj.E,则下面的表达式也等同于后面的形式:

  1. obj.E += d;              obj.add_E( d )  
  2.  
  3. obj.E -= d;              obj.remove_E( d )  

与属性一样,事件也可以被继承甚至重写。事件也可以是虚的和抽象的,理论上事件的add和remove也可以是有不同的可见性的。

与属性一样,抽象和虚的事件,其实就是表现为事件的两个方法add和remove是抽象的和虚的。

但是!事件与属性有一个最明显的不同,也就是属性是必须实现的,事件则是不必的。或者说,事件是最早出现的自动属性。

与自动属性一样,事件也会创建一个字段来保存对应的委托实例,而这个字段与事件同名且是私有。在C#中,你可以访问到这个字段,因为它真的就是一个字段。

换言之,当你在C#中写代码时,如果是在类型内部使用类型的事件,其实就是引用到那个自动生成的私有字段。换言之,在类的内部使用事件的时候,你使用的是一个委托字段而不是事件。对这个字段的操作是完全不同于在类的外部使用事件的。

当然,一旦事件写了add和remove访问器,也就不会被自动实现,也就没有这个私有字段了。同样的,因为这个字段是私有的,所以,在类的外部也是访问不到的。

【编辑推荐】

  1. 另类的思维 将事件视为对象
  2. C# TextBox事件实现实例详解
  3. 深入理解C#委托的实质
  4. C#委托基础:谈委托和接口
  5. C#委托实例简单分析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...