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


本文摘自PHP中文网,作者黄舟,侵删。

swich....case 条件分支多了之后,会严重的破坏程序的美观性。
比如这个

上述代码是用于两个进程之间通信的代码,由于通信的枚举特别的多,所以case的分支特别的多。导致了代码的可读性,可维护性严重下降。经过查找资料和重构,想到了一种可行的在这种情况替代switch...case的方案――――――利用键值对。

声明键值对对象

针对进程通信的代码逻辑,构建了如下的键值对。

1

Dictionary<EnumMsg, Action<Message>> mMessageReceiver = new Dictionary<EnumMsg, Action<Message>>();

这个键值对的键是自定义的消息枚举,值是Action<Message>的委托。这样消息枚举和消息枚举对应的处理函数就一一对应了。

初始化时注册消息

在初始化时,将枚举与相应的Action进行装载。

1

2

3

4

5

6

7

8

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代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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);

      }

基于键值对来查找对应的处理方法的代码

1

2

3

4

5

6

7

8

9

10

11

12

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语句的示例的详细内容!

相关阅读 >>

c#中异步编程4async与await异步程序开发的实例分析

总结.net mvc实现长轮询实例

c#如何使用正则表达式来验证中文字符的案例

c#中关于多线程创建对象的示例分享

c#中关于dbnull的解释

入门级的.net mvc 实例

分享n种.net获取当前路径的的实例

c#中enum与string的相互转换的示例

.net中的序列化详解

c#如何使用libusbdotnet实现usb通信的示例详解

更多相关阅读请进入《Switch...Case》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...