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语句的更多相关文章

  1. 逆向知识第九讲,switch case语句在汇编中表达的方式

    一丶Switch Case语句在汇编中的第一种表达方式 (引导性跳转表) 第一种表达方式生成条件: case 个数偏少,那么汇编中将会生成引导性的跳转表,会做出 if else的情况(类似,但还是能分 ...

  2. switch… case 语句的用法

    switch… case 语句的用法   public class Test7 { public static void main(String[] args) { int i=5; switch(i ...

  3. 为什么说在使用多条件判断时switch case语句比if语句效率高?

    在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...

  4. java中的Switch case语句

    java中的Switch case 语句 在Switch语句中有4个关键字:switch,case break,default. 在switch(变量),变量只能是整型或者字符型,程序先读出这个变量的 ...

  5. if语句,if...else if语句和switch...case语句的区别和分析

    前段时间在工作中遇到了一个关于条件判断语句的问题,在if语句,if else if语句和switch case语句这三者之间分析,使用其中最有效率的一种方法. 所以就将这个问题作为自己第一篇博客的主要 ...

  6. 为什么switch...case语句比if...else执行效率高

    在C语言中,教科书告诉我们switch...case...语句比if...else if...else执行效率要高,但这到底是为什么呢?本文尝试从汇编的角度予以分析并揭晓其中的奥秘. 第一步,写一个d ...

  7. JavaScript基础知识(if、if else、else if、while、switch...case语句)

    13.语句 概念:就是分号(:) 代表一条语句的结束 习惯:一行只编写一条语句:一行编写多条语句(代码可读性较差) 语句块:可以包含多条语句     "{ }"将多条语句包裹 u ...

  8. Java基础之循环语句、条件语句、switch case 语句

    Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: whi ...

  9. c语言中的switch case语句

    switch--case语句中,switch后面跟一个变量,这个变量不可以是字符数组,字符指针,字符串数组,浮点型(实型).它可以是整型,字符型(在本质上也是整型).所以这导致case后面的常量表达式 ...

随机推荐

  1. 关于MQ,你必须知道的

    我走过最长的路是你的套路 女:二号男嘉宾,假如我们牵手成功后,你会买名牌包包给我吗? 男:那你会听话吗? 女:会 听话. 男:听话 咱不买! OK那么消息队列MQ有什么套路呢?(这个话题转换生硬度连我 ...

  2. 从后台servlet中,获取jsp页面输入的值,来删除用户一行信息

    后台servlet设置 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws S ...

  3. nginx 安装、启动、重启、关闭 (linux系统命令行)

    前言: 最近在部署我的hexo静态博客到腾讯云服务器上,用到了很多nginx的知识,在此做下总结: 刚接触的linux服务器上,nginx配置乱的有点令人发指,就把老的卸载了重新装一下. 1.卸载 y ...

  4. 关于项目中ajax 操作 原生项目遇到的问题

    单选框动态赋值 $('input[name=pszt][value='+val+']').attr("checked",true); 置顶的几种方式 window.scrollTo ...

  5. 修改Android idc文件

    安卓系统idc文件里面包含以下几点内容: 1 #=0 外部设备 =1内部设备 2 device.internal = 0 3 #定义:keyboard.layout = <name> 4 ...

  6. spring 【二】学习之spring EL

    spring EL-spring 表达式语言,支持在xml和注解的形式,类似于JSP的el表达式的形式. 其主要使用@Value注解的结构形式 其主要功能 [1].注入普通字符串 [2].注入操作系统 ...

  7. 【XSS】对抗蠕虫 —— 如何让按钮不被 JS 自动点击

    前言 XSS 自动点按钮有什么危害? 在社交网络里,很多操作都是通过点击按钮发起的,例如发表留言.假如留言系统有 XSS,用户中招后除了基本攻击外,还能进行传播 -- XSS 自动填入留言内容,并模拟 ...

  8. #Java学习之路——基础阶段二(第六篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  9. Linux如何查看与测试磁盘IO性能

    1. 查看磁盘 IO 性能 1.1 top 命令 top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 ...

  10. 细说mysql索引

    本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname='c ...