C# - Event关键字的优点?

17 浏览
0 Comments

C# - Event关键字的优点?

我最近明白了C#中的 'event' 到底是什么。老实说,它其实什么都不是。总结一下我的发现:event关键字只是一个仅适用于委托的修饰符。 所以,事件的"魔力"就在于委托的操作。就是这样。我阅读了很多微软的文档,但没有一句话能够如此简洁地概括这个问题。继续我的发现,委托、类和结构都处于同一"级别"。它们是定义"对象"的方式。我不是指类型的"对象",而是封装的"某物"的概念。就像在说面向对象编程时使用"对象"这个词一样。

无论如何,"对象"有一些修饰符。例如,sealed、readonly、virtual、static等等...这个列表可以在这里找到:这里。在委托的情况下,它有一个额外的修饰符叫做event。event使得当一个委托被声明为类的一部分时,根据给定的访问修饰符,只公开add和remove方法。这些方法的定义与属性的get和set类似。委托的其他操作(赋值、读取访问、方法调用等)只允许在声明事件委托的类内部进行。我发现有趣的另一件事是,所有委托都有Invoke、BeginInvoke和EndInvoke方法,但你无法在Visual Studio中导航查看它们,我也找不到描述它们的文档...

好吧,了解了所有这些,使用event关键字除了修改委托的访问方式以外,还有什么优势呢?在许多情况下,似乎我最好只声明一个不带event关键字的委托。最近我遇到的一个情况是,我想创建一个包含两个事件的抽象基类。任何从这个基类派生的类都应该能够像使用自己的事件一样使用这些事件,就像使用派生类的任何其他公开对象一样(非私有的,除非派生类在另一个程序集中,且对象被声明为internal)。基本上,我希望派生类把这些事件当作自己的事件来使用。唯一的方法是将事件的后备变量暴露为protected,这样派生类就可以触发事件。看着代码,这似乎很愚蠢,因为我基本上是两次定义了委托;一次作为protected字段,一次作为公共事件。我想,

我是不是最好创建一个叫做Event的类,其构造函数中有一个Action类型的out参数?返回的action相当于许多人为委托创建的Raise扩展方法,它会检查委托是否为null,然后调用委托。Event类上唯一的公共方法是Add和Remove,用于附加委托和从底层委托中移除委托(+=,-=)。类可以将这些事件作为属性,例如,

public Event SomethingHappened { get; private set; }

这样只有该类可以重新分配事件。或者使用public readonly字段也同样有效。构造函数返回的out参数由类存储,并在类想要触发事件时调用。我知道这是一个笨拙的解决方法,但它能完成工作,并且允许事件不仅仅作为参数传递,还允许派生类在基类将其定义为protected时调用Raise方法。

简而言之:

除了修改委托的访问方式之外,使用event关键字有什么优势?

0