现在的位置: 首页 > 综合 > 正文

从属性(property)的角度来理解.NET中的事件(event)

2013年05月19日 ⁄ 综合 ⁄ 共 1119字 ⁄ 字号 评论关闭

  今天看 《深入解析C#》 第2章,提到事件,我觉得这个角度跟讲法很好。以前经常看到,事件就是一种特殊类型的委托。其实这样讲并不太妥当。根据今天的学习,应该这么理解才比较合适:

 

  类似于属性(property)是对某些成员变量的操作进行了封装简化,事件(event)也是对一类成员变量的操作进行了封装简化。特殊性在于,属性可以作用于各种类型的成员变量上,甚至是委托类型的成员变量上。但是一般不这么做,因为我们已经把这种特殊情况提取出来重新定义了一个关键字 event ,并且根据委托类型的特殊性,提供了它 +=,-= 这样的操作。并且 event 也只能操作委托这一种类型的成员变量。

 

  下面是抄书:“

  我认为将事件看做类似于属性(property)的东西是很有好处的。首先,两者都声明为具有一种特定的类型。对于事件来说,必须是一个委托类型。使用属性时,感觉就像是直接对它的字段进行取值和赋值,但你实际是在调用方法,也就是取值方法和赋值方法 。实现属性时,可以在那些方法中做它喜欢做的任何事情。但凑巧的是,大多数属性都只是实现了简单的字段,有时会在赋值方法中添加一些校验机制,有时则会添加一些线程安全性。

  同样,在订阅或取消订阅一个事件时,看起来就像是在通过+=和-=操作符使用委托类型的字段。但和属性的情况一样,这个过程实际是在调用方法(add和remove方法 )。对于一个纯粹的事件,你所能做的事情就是订阅(添加一个事件处理程序)或者取消订阅(删除一个事件处理程序)。最终是由事件方法来做真正有用的事情,如找到你试图添加和删除的事件处理程序,并使它们在类中的其他地方可用。

  "事件"存在的首要理由和"属性"差不多--它们添加了一个封装层。通常,我们不希望其他代码能直接设置字段值;最起码也要先由所有者(owner)对新值进行验证。同样,我们通常不希望类外部的代码随意更改(或调用)一个事件的处理程序。当然,类能通过添加方法的方式来提供额外的访问。例如,可以重置事件的处理程序列表,或者引发事件(也就是调用它的事件处理程序)。例如,BackgroundWorker.OnProgre- ssChanged只是调用了ProgressChanged事件的处理程序。然而,如果只对外揭示事件本身,类外部的代码就只能添加和删除事件处理程序。

  字段风格的事件使所有这些的实现变得更易阅读--只需一个声明就可以了。编译器会将声明转换成一个具有默认add/remove实现的事件和一个私有委托类型的字段。类内的代码能看见字段;类外的代码只能看见事件。这样一来,表面上似乎能调用一个事件,但为了调用事件处理程序,实际做的事情是调用存储在字段中的委托实例。”

 

抱歉!评论已关闭.