代码检查:调用多态字段式事件
请考虑以下代码片段:
public class Base
{
public virtual event EventHandler MyEvent;
}
public class Derived : Base
{
public override event EventHandler MyEvent;
public void SomeMethod()
{
var args = ...;
MyEvent(this, args);
}
}
上述代码块使用了一个重写事件声明,以重写事件中 add 和 remove 方法的实现。 该字段本身将存在于两个单独的实例中——一个在 基类 中,另一个在 派生类 中。 因此,当使用 派生类 时,您可能永远不会实例化 基类 的 MyEvent ,除非您明确将其设置为某个值。 因此,当事件在基类中引发时,其行为将与在派生类中引发时的行为不同。
解决上述情况的最简单方法是去掉重写,而是在基类中创建一个触发事件的方法。 例如:
public class Base
{
public event EventHandler MyEvent;
public void FireMyEvent(object sender, EventArgs args)
{
var e = MyEvent;
if (e != null)
e(sender, args);
}
}
public class Derived
{
public void SomeMethod()
{
var args = ...;
FireMyEvent(this, args);
}
}
最后修改日期: 2025年 9月 27日