关于大量事件(event)的优化

Baesky 2010-09-03 10:50:09
例如:
switch(expr)
case ex1:
OnXXX();
break;
case ex2:
OnXXX();
break;
case ex3:
OnXXX();
break;
case ex4:
OnXXX();
break;
....

有很多case,而且并不见得程序运行时候所有CASE里的事件都需要产生,有可能就几个事件会在初始化时候产生委托链,这样的话我该如何优化委托链呢?在CLR via C#里,jeff叔举了个例子,说一个control里面有70多个事件,并不是每个都会在control实例出来时候给初始化的,他描述的方法貌似不错,但是没看懂,望高人指点。~~~~~
...全文
115 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodish 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 baesky 的回复:]
例如:
switch(expr)
case ex1:
OnXXX();
break;
case ex2:
OnXXX();
break;
case ex3:
OnXXX();
break;
case ex4:
OnXXX();
break;
....

有很多case,而且并不见得程序运行时候所有CASE里的事件都需要产生,有可能就几……
[/Quote]


继承自Component,即可使用Framework为你提供了Event机制,通过一个EventHandlerList来保存所有的Delegate,通过Object<-->Delegate的对应关系找到相应的那个Delegate...

jeff叔指的就是这个...

具体见代码


public class EventSample : Component
{
private static readonly object eventKey = new object();
public event EventHandler MyEvent
{
add
{
this.Events.AddHandler(eventKey, value);
}
remove
{
this.Events.RemoveHandler(eventKey, value);
}
}

protected virtual void OnMyEvent(EventArgs e)
{
EventHandler evt = this.Events[eventKey] as EventHandler;
if (evt != null)
{
evt(this, e);
}
}
}
gongsun 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sp1234 的回复:]
你的一大堆case跟“大量事件(event)”有什么关系?
[/Quote]

哈哈,进来前我也想歪了...

题目是 大量事件(event) 进来看到了一堆 case。

感觉被忽悠了。

porschev 2010-09-03
  • 打赏
  • 举报
回复
搬个凳子看看。。。。
xupeihuagudulei 2010-09-03
  • 打赏
  • 举报
回复
看看MSDN 的类EventList是如何处理的
changjiangzhibin 2010-09-03
  • 打赏
  • 举报
回复
如果情况确实有很多种,只能Case或若干个If Else;

即使你写了一个专门处理事件的类,到最后还是要判断。
  • 打赏
  • 举报
回复
你的一大堆case跟“大量事件(event)”有什么关系?
  • 打赏
  • 举报
回复
[Quote=引用楼主 baesky 的回复:]
在CLR via C#里,jeff叔举了个例子,说一个control里面有70多个事件,并不是每个都会在control实例出来时候给初始化的,他描述的方法貌似不错,但是没看懂,望高人指点。~~~~~[/Quote]

那跟你说的case有什么关系?八杆子打不着,节省new几个event实例对象,跟你的一堆case没有关系!
myhope88 2010-09-03
  • 打赏
  • 举报
回复
我也只有想到这了,不知道有啥更好的办法
Baesky 2010-09-03
  • 打赏
  • 举报
回复
主要不想采用下面这个枯燥的方式写代码:
if(OnXXX != null)
OnXXX();
兔子-顾问 2010-09-03
  • 打赏
  • 举报
回复
有很多case,而且并不见得程序运行时候所有CASE里的事件都需要产生,有可能就几个事件会在初始化时候产生委托链,这样的话我该如何优化委托链呢?

书上说的是Control处理消息的部分,消息本身就是抽象出来具有类似的行为的。所以可以用一个switch,区分message,然后调用对应的OnXXX方法,方法中判断事件是否注册,在必要时候调用事件。

委托链是系统自动产生的,多播委托类实现的,你优化不了。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧