【问题标题】:What's the impact of not using MyBase.OnInit(e) when overriding it in a derived class?在派生类中重写它时不使用 MyBase.OnInit(e) 有什么影响?
【发布时间】:2016-04-18 00:07:33
【问题描述】:

我从 TextBox 继承并覆盖 OnInit。

Protected Overrides Sub OnInit(e As EventArgs)

MyBase.OnInit(e) 

' I'm adding a dynamic control to go along with my textbox here...
Controls.Add(Something)

End Sub

我在上面的示例中有 MyBase.OnInit(e),但是我已经使用了一段时间没有它的控件,因为我忘了把它放在那里。这是我通常出于习惯做的事情,所以我从来没有考虑过它的目的:

在派生类中重写 OnInit 时,请务必调用基类 类的 OnInit 方法,以便注册的委托接收事件。

有点尴尬,这对我来说不是很清楚,但我的控制工作正常,所以我只是希望有人能举例说明什么可能会造成问题。

【问题讨论】:

  • 我想它会破坏正在监听 OnInit 事件的代码

标签: c# asp.net vb.net


【解决方案1】:

查看TextBoxreference source code,如果您遵循直到Control 的继承,您会看到这是OnInit 的基本代码:

protected internal virtual void OnInit(EventArgs e) {
    if(HasEvents()) {
        EventHandler handler = _events[EventInit] as EventHandler;
        if(handler != null) {
            handler(this, e);
        }
    }
}

所以如果你不打电话给base.OnInit,就会错过这个。

【讨论】:

  • 对。我在基本层面上理解了这一点,但不确定哪种类型的“事件”会导致问题。例如,OnTextChange 是一个事件,但您也可以调用基础 OnTextChange。或者,如果我在我的类定义中添加一个处理程序(我也这样做了),它也没有问题,即使我忘记调用 MyBase.OnInit(e)。所以我知道你的答案是正确的,但我显然没有完全理解。
  • 我猜关键是还有其他东西在监听事件。如果您错过了碱基调用,那么奇怪的事情可能会发生。所以除非你特别清楚自己在做什么,否则我总是会把它们放在那里。
  • 完全同意,直到我忘了把它放在那里,直到一个月后才注意到它,我才想知道为什么一切都很好。所以现在我的任务是完全消化微软的另一个复杂部分。似乎这永远不会结束。
猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 2012-02-18
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多