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

swich….case 条件分支多了之后,会严重的破坏程序的美观性。
比如这个
C#如何使用键值对取代Switch...Case语句的示例

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

声明键值对对象

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

Dictionary> mMessageReceiver = new Dictionary>();

登录后复制

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

初始化时注册消息

在初始化时,将枚举与相应的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语句的示例的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2493651.html

(0)
上一篇 2025年3月5日 01:35:33
下一篇 2025年3月5日 01:35:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • C#中关于Cookies的读取实例详解

    C#中Cookies的读取 链接: 一 、写入Cookie   1. Name 和 Value 属性由程序设定,默认值都是空引用。   2. Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。 D…

    编程技术 2025年3月5日
    200
  • C#异步之APM模式异步程序开发的示例分享

    c#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,c#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下c#中的异步编程的发展历程。广告一下:喜欢我文章的朋友,请点下面的“关注我”。谢谢 我是2004年…

    2025年3月5日
    200
  • C#中关于async与await的使用详解

    本篇文章主要介绍了说说c#的async和await的具体用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 C# 5.0中引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。 看个例子:…

    编程技术 2025年3月5日
    200
  • C#中String类型与json之间相互转换的实现方法

    这篇文章主要介绍了c#实现string类型和json之间的相互转换功能,涉及c# json格式数据的构造、转换相关操作技巧,需要的朋友可以参考下 本文实例讲述了C#实现String类型和json之间的相互转换功能。分享给大家供大家参考,具体…

    编程技术 2025年3月5日
    200
  • C# Facade外观模式中天河城购物出现的问题解决

    这篇文章主要介绍了c#设计模式之facade外观模式解决天河城购物问题,简单描述了外观模式的定义并结合具体实例分析了外观模式解决购物问题的相关步骤与操作技巧,需要的朋友可以参考下 本文实例讲述了C#设计模式之Facade外观模式解决天河城购…

    2025年3月5日
    200
  • C#中Builder生成器模式解决配置电脑的问题详解

    这篇文章主要介绍了c#设计模式之builder生成器模式解决带老婆配置电脑问题,简单介绍了生成器模式的概念、功能并结合具体实例形式分析了c#生成器模式解决配电脑问题的步骤与相关操作技巧,需要的朋友可以参考下 本文实例讲述了C#设计模式之Bu…

    2025年3月5日
    200
  • C#实现Json序列化删除null值的方法实例

    要将一个对象序列化,可是如果对象的属性为null的时候,我们想将属性为null的都去掉,怎么处理呢?其实方法很简单的,下面就跟随脚本之家小编一起学习c#中 json 序列化去掉null值的方法吧 要将一个对象序列化,可是如果对象的属性为nu…

    编程技术 2025年3月5日
    200
  • C#中发送邮件的实现方法详解

    这篇文章主要为大家详细介绍了c#实现发送邮件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 #region 发送邮件部分    private …

    编程技术 2025年3月5日
    200
  • C#中关于Minutes与TotalMinutes的区别

    今天测试提了一个bug,说是消息提醒的时机不对,设置的提前2小时,还没到就提醒了。 看了下代码 (m.ExpectReceiveTime – DateTime.Now).Minutes 执行(m.ExpectReceiveTime – Da…

    编程技术 2025年3月5日
    200
  • C#中关于表达式树的简单介绍

    表达式树可以说是linq的核心之一,为什么是linq的核心之一呢?因为表达式树使得c#不再是仅仅能编译成il,我们可以通过c#生成一个表达式树,将结果作为一个中间格式,在将其转换成目标平台上的本机语言。比如sql。我们常用的linq to …

    2025年3月5日
    200

发表回复

登录后才能评论