JetBrains Rider 2025.2 Help

代码检查:调用类似字段的多态事件

请考虑以下代码片段:

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日