代码检查:调用类似字段的多态事件
请考虑以下代码片段:
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月 26日