在C#中覆盖事件真的是一个错误吗?

Ala*_*ain 2 c# wpf coding-style event-handling .net-3.5

我在这个问题中读到:在VB中覆盖事件

在C#中覆盖事件甚至是错误的.C#编程指南说:不要在基类中声明虚拟事件,并在派生类中覆盖它们.C#编译器在Microsoft Visual Studio 2008中无法正确处理这些问题,并且无法预测派生事件的订阅者是否实际订阅了基类事件.我想知道为什么框架类会破坏这个规则,甚至编译器为什么允许它.

我无法理解为什么覆盖事件是一个错误.当然,继承类总是可以监视基类事件并在之后采取自己的操作,但是如果它想确保它是第一个查看事件的事件观察者呢?它想在某些条件下决定吞下这个事件?做这样的事情有什么问题:

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        VerifyActiveCountMatches();
        base.OnCollectionChanged(e);
        InvokePropertyChanged("Count");
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

这样做并不是一个错误 - 但它可能是一个糟糕的设计决定.有很大的不同; 编译器不会让你逃脱错误,但它很少批评你的设计.

你已经证明了的代码OnCollectionChanged不能覆盖的事件-它会覆盖该方法引发的事件.那是完全不同的事情.事件是这样的:

// "Field-like" event - the compiler implements the add/remove and
// creates a backing field.
public event EventHandler Click;
Run Code Online (Sandbox Code Playgroud)

要么

// Manually-implemented event; you write the add/remove yourself, and
// create a separate backing variable if necessary.
public event EventHandler Click
{
    add { ... }
    remove { ... }
}
Run Code Online (Sandbox Code Playgroud)

这些是处理订阅和取消订阅的代码片段 - 而这些建议告诉您不应该覆盖.你很少想要,而且正如引用的文字所说的那样,在很多情况下它无论如何都不会做你想要的.