处理事件和扩展 class 以及覆盖相关的 protect On... 方法有什么区别?

What is the difference betwen handling an event and extending a class and overriding the related protect On... method?

在 .NET System.Windows 程序集中,classes 通常定义事件并在对象的整个生命周期内引发它们。例如,UIElement class 定义了 KeyUp 事件,即 'alias to the Keyboard.KeyUp event':

public event KeyEventHandler KeyUp;

但是,它还声明了 protected OnKeyUp 方法,该方法在触发事件时调用:

protected virtual void OnKeyUp(KeyEventArgs e);

据我所知,每个事件都有一个受保护的方法。由于这些方法受到保护,因此只能从扩展 UIElement class 的 class 调用它们。假设我有这样一个扩展 class.

我的问题是,鉴于我的 class 扩展了 UIElement class,覆盖受保护的方法和处理相关事件之间有什么区别?有区别吗?使用受保护的方法比处理事件有什么好处吗?

在功能上,它们通常以可互换的方式使用。从理论上讲,您可以在 override 方法中做更多的事情 - 您可以抑制事件引发 外部 调用者,或者修改他们根据收到的参数看到的内容(例如,假装按下了 different 键),但是......大多数时候你不这样做,所以它没有实际意义。在涉及的实际对象方面也有一些小的变化。当使用 override 时,当 您的代码发生时,您也比 有更多保证(如果有多个订阅者使用同一个 event/object)。但同样:通常,它们 很大程度上 可以互换。当同一个对象引发和处理,而不是订阅事件在你自己身上,但两者都可以。