当前位置: 首页 > news >正文

使用Action表驱动代替switch…case语句

大家都知道,代码中出现过多的if…else嵌套语句时很难读,所以常用switch…case语句进行代替,代码的可读性就好了很多。

举个简单的例子:

public void DoSomeThing(string str){if (str == "A") {DoSomethingForA(str);}else if (str == "B") {DoSomethingForB(str);}else if (str == "C") {DoSomethingForC(str);}}

我们一眼就看出,这段代码可以使用switch语句进行重构,重构后的代码如下:

public void DoSomeThing(string str)
    {
      switch (str) {
        case "A":
          DoSomethingForA(str);
          break;
        case "B":
          DoSomethingForB(str);
          break;
        case "C":
          DoSomethingForC(str);
          break;
        default:
          break;
      }
    }
这样看下去,代码确实清晰了很多.这种重构方法我们很多人都会这么做,而且效果还不错.上面的例子中代码行还很少,实际当中有可能会出现很多的case语句, 即使我们这样重构,在阅读的时候还是需要拉很长的滚动条才可以看到需要找的case语句对应的代码.所以,针对这种情况,我们还可以用更简洁的方法进行重构. 实现起来也挺简单的,即:建立全局的字典类型的变量,保存不同的case语句条件以及对应的方法,这样,在需要调用的时候直接查找到该方法,invoke即可,其实也是用了委托来实现.看以下代码:
private static Dictionary<string, Action<string>> dict = new Dictionary<string, Action<string>>();public BuildDictionary(){dict.Add("A", DoSomethingForA);dict.Add("B", DoSomethingForB);dict.Add("C", DoSomethingForC);}

上面是声明变量及填充字典,做好这部分的工作之后,调用起来就方便多了,同样的DoSomeThing方法,代码就少了很多

public void DoSomeThing(string str){if (dict.ContainsKey(str)) {Action<string> action = dict[str];action.Invoke(str);}}

重构之后,是不是简洁了很多,即使再多的case语句,我们也只需要在BuildDictionary方法中把它添加进去就可以了。

那么,是不是所有的switch…case语句都可以这样重构呢,以这样的实现方式来看,需要case条件对应的方法参数类型相同,这样才容易构造出字典来保存。

如果方法还要返回值,那我们就不能用Action,需要用Func表达式来保存,因为它可以带有返回值。

http://www.jsqmd.com/news/44022/

相关文章:

  • LangChain v1.0 Agent的工具定义及调用
  • linux c qt
  • linux c mysql库
  • L11 RuoYi_数据分页的总条数分析
  • 2025最新江苏苏州、高邮、镇江方向(专线)物流、当日往返运输、配送中心、分拨中心服务商推荐:时效性高,线路可定制,提供仓储、供应链等物流全链条服务
  • c#json帮助类
  • 11.17 事务的隔离级别
  • 获取当前软件的内存
  • foobar2000 v2.25.3 汉化版
  • 详细介绍:深度学习 计算机视觉 Kaggle(上):从理论殿堂起步 ——像素、特征与模型的进化之路
  • 默认SVN忽略bin和obj文件夹,即使是Add也不默认勾选
  • DDOS 科普与防御
  • 思维trick总结
  • Web of Things (WoT) 物描述 2.0 首个公开工作草案发布
  • IGMP 因特网组管理协议
  • msys中安装git for window
  • 图形渲染与 GPU 交互中的 C++ 性能优化技巧 - 教程
  • 详细介绍:代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
  • 以太网交换机的吞吐量
  • Traefik:Go 实现的云原生反向代理,微服务路由自动化利器
  • 罗盘
  • 第一章 语法基础——语法基础
  • 计算机网络中最短帧长的概念
  • Cypher语法
  • 2025江浙沪方向专线物流、(冷库)往返运输、智能仓储优选服务商推荐:深耕江苏苏州、高邮、镇江,覆盖全国及国际线路,供应链定制方案/当日往返物流/智能共享仓储/分拨中心
  • 【Wireshark数据分析实战】 - 指南
  • 【贪心】P9525 [JOIST 2022] 团队竞技 / Team Contest 题解
  • noip9
  • 常见的steam游戏的营销错误
  • MX Round 26 解题报告