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)
这样做并不是一个错误 - 但它可能是一个糟糕的设计决定.有很大的不同; 编译器不会让你逃脱错误,但它很少批评你的设计.
你已经证明了的代码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)
这些是处理订阅和取消订阅的代码片段 - 而这些建议告诉您不应该覆盖.你很少想要,而且正如引用的文字所说的那样,在很多情况下它无论如何都不会做你想要的.