考虑以下代码:
public class TableMain {
public virtual event Action UpdateFilter;
....
}
public class TableSub : TableMain {
public override event Action UpdateFilter;
public void UpdateQuery() {
.....
if (UpdateFilter!=null) {
UpdateFilter(); // Invocation of polymorphic field-like event???
}
}
}
在此代码中,ReSharper显示警告“调用多态字段事件”。
我的问题是: 它究竟意味着什么?这是一个糟糕的编程习惯的警报吗? 此外,以多态方式调用事件是不好的做法吗? (知道事件只能从声明它的类中提出。)
答案 0 :(得分:42)
嗯,你实际上在这里有两个字段式事件。您的覆盖将覆盖添加/删除部分,但您将有两个字段 - 一个在TableMain
中,另一个在TableSub
中。只有TableSub
中的那个才会是非空的,除非在TableMain
中明确设置了值...所以如果TableMain
曾尝试提升事件本身,则不会调用与TableSub
中相同的一组处理程序。基本上,它会表现得很奇怪。
正确的方法是在TableMain
中提供受保护的方法,以允许子类引发事件:
protected void OnUpdateFilter()
{
Action handler = UpdateFilter;
if (handler != null)
{
handler();
}
}
然后将事件设为非虚拟,并删除TableSub
中的覆盖。
请注意,您的事件签名与事件的常规约定不符 - 任何不使用EventHandler
的原因?