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

互联网 17-9-7
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.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: csharp
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:ASP.NET MVC如何正确运用异步编程技术

相关资讯