zoukankan      html  css  js  c++  java
  • C# 9 新特性 —— 增强的模式匹配

    C# 9 新特性 —— 增强的模式匹配

    Intro

    C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧

    Sample

    C# 9 中增强了模式匹配的用法,增加了 and/or/not 操作符,而且可以直接判断属性,来看一下下面的这个示例:

    var person = new Person();
    
    // or
    // string.IsNullOrEmpty(person.Description)
    if (person.Description is null or { Length: 0 })
    {
        Console.WriteLine($"{nameof(person.Description)} is IsNullOrEmpty");
    }
    
    // and
    // !string.IsNullOrEmpty(person.Name)
    if (person.Name is not null and { Length: > 0 })
    {
        if (person.Name[0] is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.')
        {
        }
    }
    
    // not
    if (person.Name is not null)
    {
    }
    

    这里的代码使用 DnSpy 反编译之后的代码是下面这样的:

    Person person = new Person();
    string text = person.Description;
    bool flag = text == null || text.Length == 0;
    if (flag)
    {
        Console.WriteLine("Description is IsNullOrEmpty");
    }
    text = person.Name;
    bool flag2 = text != null && text.Length > 0;
    if (flag2)
    {
        char c = person.Name[0];
        if (c >= 'a')
        {
            if (c > 'z')
            {
                goto IL_8B;
            }
        }
        else if (c >= 'A')
        {
            if (c > 'Z')
            {
                goto IL_8B;
            }
        }
        else if (c != ',' && c != '.')
        {
            goto IL_8B;
        }
        bool flag3 = true;
        goto IL_8E;
        IL_8B:
        flag3 = false;
        IL_8E:
        bool flag4 = flag3;
        if (flag4)
        {
        }
    }
    bool flag5 = person.Name != null;
    if (flag5)
    {
    }
    

    Switch

    这不仅适用于 is 也可以在 switch 中使用

    switch (person.Age)
    {
        case >= 0 and <= 3:
            Console.WriteLine("baby");
            break;
    
        case > 3 and < 14:
            Console.WriteLine("child");
            break;
    
        case > 14 and < 22:
            Console.WriteLine("youth");
            break;
    
        case > 22 and < 60:
            Console.WriteLine("Adult");
            break;
    
        case >= 60 and <= 500:
            Console.WriteLine("Old man");
            break;
    
        case > 500:
            Console.WriteLine("monster");
            break;
    }
    

    反编译后的代码:

    int age = person.Age;
    int num = age;
    if (num < 22)
    {
        if (num < 14)
        {
            if (num >= 0)
            {
                if (num > 3)
                {
                    Console.WriteLine("child");
                }
                else
                {
                    Console.WriteLine("baby");
                }
            }
        }
        else if (num > 14)
        {
            Console.WriteLine("youth");
        }
    }
    else if (num < 60)
    {
        if (num > 22)
        {
            Console.WriteLine("Adult");
        }
    }
    else if (num > 500)
    {
        Console.WriteLine("monster");
    }
    else
    {
        Console.WriteLine("Old man");
    }
    

    More

    可以看到有些情况下可以简化不少代码,尤其是 if 分支比较多的情况下使用上面 switch 这样的写法会清晰很多

    但是如果只是 string.IsNullOrEmpty 这种代码最好还是不要写得这么骚了,小心要被同事吐槽了

    炫技需谨慎,小心被 ...

    Reference

  • 相关阅读:
    75.iOS内存管理
    74.CocoaPods安装和使用教程
    73.解决Xcode10 library not found for -lstdc++ 找不到问题
    eclipse中启动tomcat,不能访问localhost解决办法
    点对点模式
    点对点架构模式
    淘宝网分析质量属性场景
    架构漫谈读后感
    《探索需求》阅读笔记6
    《探索需求》阅读笔记5
  • 原文地址:https://www.cnblogs.com/weihanli/p/14226240.html
Copyright © 2011-2022 走看看