2009-04-15 67 views
0


为什么派生类在不附加委托的情况下处理事件?

Q1:

“的ListControl.OnSelectedIndexChanged方法还允许派生类对事件进行处理而不必附加委托。这是在派生类中处理事件的首选技术“。


A)如果我理解了上面的报价,那么如果我们推导自ListControl类,我们应该的,而不是订阅SelectedIndexChanged事件,治疗OnSelectedIndexChanged()方法作为一个事件处理程序,并从而把它里面的任何事件处理逻辑:

protected override void OnSelectedIndexChanged(
EventArgs e 
{ 
    //event handling logic 
} 

为什么会是这样比通过OnSelectedIndexChanged =“name_of_event_handler”订阅的事件(内侧的.aspx)更好?


B) 不管怎么说,在ASCX文件中,我们使用OnSelectedIndexChanged属性,事件处理程序附加到事件。该属性的名称与OnSelectedIndexChanged()方法的名称相同。这是为什么?为什么不是代替这个属性的名称的SelectedIndexChanged:

<asp:ListControl SelectedIndexChanged = ”name_of_event_handler” 

毕竟,属性指的是事件,而不是一个方法(OnSelectedIndexChanged())调用此事件!


感谢名单


编辑:

你好,

但是,要确保你打电话base.On [事件名称]或事件赢了' t火!

假设你不希望其他人能够响应这个事件,那么是否完全可以不调用base.On [EventName],因为我认为不会调用它不会真的除了不发射事件(因此事件处理程序不会被调用)之外还有什么伤害?

我意识到一些事件需要被解雇才能让Framework完成它的工作,但是如果不调用base.On [SelectedIndexChanged]呢?

回答

1

通常,我更喜欢重写On [EventName]函数,以便可以控制我的逻辑是在任何订户的逻辑之前还是之后发生。

但是,请确保您调用base.On [EventName]或事件不会触发!

4

正是在这种“更好”:

  • 它是便宜使用virtual(继承)如果可能的话 - 它删除了一些额外的对象需要(委托实例等)
  • 它允许压倒一切的代码来知道它在序列中的位置 - 即如果多个呼叫者正在监听,它是否会首先启动?第二?在中间?

第一点是为了效率可以说是更重要的,尤其是在这样的事情有稀疏的事件处理程序的控制(即之类的东西EventHandlerList代替场样事件)。

我真的不明白第二个问题,但在猜测:约定。

相关问题