c# 9.0新特性nint和Pattern matching的使用方法

2020-06-15 17:00:24刘景俊
的这种情况,有时候嵌套甚至达到5,6层之多,特别影响代码可读性,我就来YY个例子。

现在各个地方都在发不同面值的消费券,为了实现千人千面,消费券的发放规则如下:

性别 年龄 地区 面值
<20 安徽 2000
<40 上海 4000
剩余 剩余 3000
<20 安徽 2500
<60 安徽 1500

如果用传统的方式,你肯定要用各种花哨的if/else来实现,如下代码:

  static decimal GetTicket(string sex, int age, string area)
  {
   if (sex == "男")
   {
    if (age < 20 && area == "安徽")
    {
     return 2000;
    }
    else
    {
     if (age < 40 && area == "上海")
     {
      return 4000;
     }
     else
     {
      return 3000;
     }
    }
   }
   else
   {
    if (age < 20 && area == "安徽")
    {
     return 2500;
    }
    if (age < 60 && area == "安徽")
    {
     return 1500;
    }
   }

   return 0;
  }

这种代码可读性不是一般的差,就像大强子说的那样:看着都想打人。。。 问题来了,这代码还有救吗??? 当然有了,这就需要用Pattern matching 去简化,毕竟它就是为了这种问题而生的,修改后的代码如下:

  static decimal GetTicket_Pattern(string sex, int age, string area)
  {
   return (sex, age, area) switch
   {
    ("男", < 20, "安徽") => 2000,
    ("男", < 40, "上海") => 4000,
    ("男", _, _) => 3000,
    ("女", < 20, "安徽") => 2500,
    ("女", < 60, "安徽") => 1500,
    _ => 0
   };
  }

看到这种化简后的代码是不是非常惊讶,这就是 Pattern matching 要帮你解决的场景,接下来看看底层的IL代码是什么样子。

从图中看,这反编译后的代码比我手工写的还要烂,无力吐槽哈,当然 模式匹配 有各种千奇百怪的玩法,绝对让你瞠目结舌,更多玩法可参考官方文档:模式匹配

这个特性最重要的是你一定要明白它的客户群在哪里?

三: 总结

总的来说,这两个特性都是比较实用的,尤其是 Pattern matching 化解了你多少不得不这么写的烂代码,头发护理就靠它了,快来给它点个赞吧!

好了,先就这样吧,感谢您的阅读,希望本篇对你有帮助,谢谢。