C# 9 新特性:增强的模式匹配了解一下!

共 2248字,需浏览 5分钟

 ·

2021-01-06 12:56

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[0is (>= '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

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
  • https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample
  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/PatternMatchingSample.cs
回复 【关闭】广
回复 【实战】获取20套实战源码
回复 【被删】
回复 【访客】访
回复 【小程序】学获取15套【入门+实战+赚钱】小程序源码
回复 【python】学微获取全套0基础Python知识手册
回复 【2019】获取2019 .NET 开发者峰会资料PPT
回复 【加群】加入dotnet微信交流群

再见,VIP,卧槽又来一个看片神器!


副业刚需,个人开发者如何通过小程序变现?已经有朋友变现月入4k了!


浏览 12
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报