4

将虚拟方法注册为事件处理程序而不是注册委托给虚拟方法的私有方法是否有任何问题?我更喜欢选项 1(这似乎可行),但我想确保它以后不会咬我。

选项1

public class Controller1
{
    public Controller1(EventNotifier eventNotifier)
    {
        eventNotifier.ImportantEvent += OnEventNotifierImportantEvent;
    }

    protected virtual void OnEventNotifierImportantEvent(object sender, EventArgs e)
    {
    }
}

选项 2

public class Controller2
{
    public Controller2(EventNotifier eventNotifier)
    {
        eventNotifier.ImportantEvent += eventNotifier_OnImportantEvent;
    }

    private void eventNotifier_OnImportantEvent(object sender, EventArgs eventArgs)
    {
        OnEventNotifierImportantEvent(sender, eventArgs);
    }

    protected virtual void OnEventNotifierImportantEvent(object sender, EventArgs e)
    {
    }
}
4

1 回答 1

5

只是永远不要在构造函数中引发事件。这适用于在构造函数中调用任何虚拟方法,而不仅仅是引发事件。原因是对象被实例化,构造函数以自上而下的方式执行,而虚拟方法基本上是自下而上解析的。虽然虚拟方法的代码很容易找到,但如果在构造函数中调用它,则最派生的实现可能依赖于根本不存在的状态数据,因为对象尚未完全实例化。

第二个选项基本上愚弄了 ReSharper 之类的重构助手,因此他们不会将“构造函数中的虚拟调用”标记为问题;构造函数中的调用不是虚拟的,除非它足够聪明,可以追踪(大多数都不是),否则它不会对级联的虚拟事件视而不见。但是,如果事件(任何一个)是从构造函数中引发的,仍然会有问题。

除此之外,我不知道有任何问题。

于 2012-11-20T23:56:50.090 回答