• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c# 搞代码 4年前 (2022-01-09) 27次浏览 已收录 0个评论

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<a>本文来源gao($daima.com搞@代@#码(网</a>)        {            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语句的示例的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C#如何使用键值对取代Switch…Case语句的示例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址