您好,欢迎访问一九零五行业门户网

C#如何使用键值对取代Switch...Case语句的示例

swich....case 条件分支多了之后,会严重的破坏程序的美观性。
比如这个
上述代码是用于两个进程之间通信的代码,由于通信的枚举特别的多,所以case的分支特别的多。导致了代码的可读性,可维护性严重下降。经过查找资料和重构,想到了一种可行的在这种情况替代switch...case的方案——————利用键值对。
声明键值对对象针对进程通信的代码逻辑,构建了如下的键值对。
dictionary<enummsg, action<message>> mmessagereceiver = new dictionary<enummsg, action<message>>();
这个键值对的键是自定义的消息枚举,值是action<message>的委托。这样消息枚举和消息枚举对应的处理函数就一一对应了。
初始化时注册消息在初始化时,将枚举与相应的action进行装载。
private void subscribemessagereceiver() { mmessagereceiver.add(enummsg.send_pano_param, updatepano); mmessagereceiver.add(enummsg.cmd_pano_view, executepanoviewcommand); mmessagereceiver.add(enummsg.cmd_pano_length_measure, executelengthmeasure); mmessagereceiver.add(enummsg.cmd_pano_area_measure, executeareameasure); mmessagereceiver.add(enummsg.cmd_pano_quick_pick, executeqickpickcommand); }
这样就把键值对对象构建完成。那么就可以将重构swith...case代码段了。
修改switch...case代码段重构前的switch....case代码
protected override void defwndproc(ref message m) { switch (m.msg) { case ((int)api.wm_copydata): { switch ((int)m.wparam) { case ((int)procedure.openskyline): m = openskylineview(m); break; case ((int)procedure.measureare): m = measure(m); break; case ((int)procedure.measurelength): m = measure(m); break; } } break; default: break; } base.defwndproc(ref m); }
基于键值对来查找对应的处理方法的代码
protected override void defwndproc(ref message m) { base.defwndproc(ref m); if (m.msg == (int)api.wm_copydata) { enumpanomsg penumpanomsg = (enumpanomsg)m.wparam; if (mmessagereceiver.keys.contains(penumpanomsg)) { mmessagereceiver[penumpanomsg](m); } } }
根据键值对的键来进行查找,当需要增加新的case分支的时候,原本的方法需要更改switch....case分支,但是利用键值对的方法,只需要编写新的处理方法,并且在键值对中增加新的一对键值就可以了。代码简洁美观,没有一长串令人厌烦的case了。
以上就是c#如何使用键值对取代switch...case语句的示例的详细内容。
其它类似信息

推荐信息