C# 在控件扩展中,是重写还是添加处理程序?

C# 在控件扩展中,是重写还是添加处理程序?,c#,wpf,C#,Wpf,我为DataGrid创建了一个扩展。我想知道在这种情况下做事情的更好方法是什么 添加这样的处理程序是否更好: class MyDataGrid : DataGrid { public MyDataGrid() { this.PreviewKeyDown+= MyDataGrid_PreviewKeyDown; } protected void MyDataGrid_PreviewKeyDown(/* args */) {/* do stuff */} }

我为DataGrid创建了一个扩展。我想知道在这种情况下做事情的更好方法是什么

添加这样的处理程序是否更好:

class MyDataGrid : DataGrid {
    public MyDataGrid() {
        this.PreviewKeyDown+= MyDataGrid_PreviewKeyDown;
    }

    protected void MyDataGrid_PreviewKeyDown(/* args */) {/* do stuff */}
}
或者使用如下覆盖:

class MyDataGrid : DataGrid {
    public MyDataGrid() { }
    protected override void OnPreviewKeyDown(/* args */) {/* do stuff */}
}

如果我让
base.OnPreviewKeyDown(e)在覆盖中,它是否与eventHandler执行相同的操作

这两种方式可能都不重要。也就是说,您应该重写该方法——它的全部目的是从控件内处理事件。如果您添加了一个事件处理程序,那么您将不必要地向事件的调用列表中添加另一个方法(即,轻微的性能影响)

如果你想对性能严格/狂热,那么你也可以将你的“MyDataGrid”类“密封”


这允许编译器/运行时确定它不需要检查“MyDataGrid”类上方的虚拟方法“OnPreviewKeyDown”的任何重写。

是,如果从重写的方法调用基方法,则两者都是等效的。第二个代码段更好。它迫使你考虑一个你还没有考虑过的细节。您是否在“做事”之前调用base.OnPreviewKeyDown()?还是之后?或者根本没有?很可能你现在还不知道,因为你还没有考虑过。这很重要。该事件的问题在于,如果结果证明它确实重要,则无法修复它。
sealed class MyDataGrid : DataGrid { ... }