一:靠山

1. 讲故事

上一篇跟人人聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都到达了新高,甚是欣慰,不管人人对新特征是多头照样空头,最少照样对它抱有一种极为关注的态度,以是我的这个系列还得跟,那就继续开撸吧,今天继续带来两个新特征,更多新特征列表,请人人关注:新特征预览

二:新特征研究

1. Native ints

从字面上看貌似是什么原生类型ints,有点莫名其妙,照样看一看Issues上举得例子吧:

Summary: nint i = 1; and nuint i2 = 2;

Shipped in preview in 16.7p1.

有点意思,照样第一次看到有nint这么个器械,应该就是C#9新增的关键词,好奇心爆棚,快来实操一下。

   static void Main(string[] args)
   {
        nint i = 10;
        Console.WriteLine($"i={i}");
   }

从图中看,可以原样输出,然后用ILSpy查查底层IL代码,发现连IL代码都不用看。如下图:

从图中看原来 nint 就是 IntPtr 结构体哈,若是你玩过 C# 到 C++ 之间的互操作,我相信你会对Ptr再熟悉不过了,从这个 nint 上看,你不觉得C#团队对指针操作是亘古未有的重视吗? 前有指针类型IntPtr,后有内存段处置聚集Span,到现在直接提供关键词支持,就是尽最大努力让你在类型平安的前提下使用指针。

这就让我想起了前些天写的一篇互操作的文章,现在就可以用nint举行简化了,来段代码给人人看一下。

  • 原来的写法:

    [DllImport("ConsoleApplication1.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    extern static IntPtr AddPerson(Person person);
    
    static void Main(string[] args)
    {
        var person = new Person() { username = "dotnetfly", password = "123456" };
        var ptr = AddPerson(person);
        var str = Marshal.PtrToStringAnsi(ptr);
    }
  • IntPtr -> nint 的写法

总的来说这个关键词不是最主要的,主要的是C#团队对指针操作抱有亘古未有的重视,这是一个异常努力的信号。

2. Pattern matching improvements

模式匹配这个不算是什么新特征了,在本次C#9中也是继续得到了完善,可能有许多同伙对模式匹配不是很熟悉,究竟是C#7才有的新玩法,后面险些每一个新版本都在跟踪完善,我先科普一下吧。

,

欧博会员开户

欢迎进入欧博会员开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

,

模式匹配到底解决了什么问题

人人在编码的过程中,不可能遇不到 if/else 嵌套 if/else 的这种情形,有时候嵌套甚至到达5,6层之多,稀奇影响代码可读性,我就来YY个例子。

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

性别 岁数 区域 面值
男 <20 安徽 2000
男 <40 上海 4000
男 剩余 剩余 3000
女 <20 安徽 2500
女 <60 安徽 1500
若是用传统的方式,你一定要用种种花哨的if/else来实现,如下代码:

    static decimal GetTicketFee(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 GetTicketFee_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 化解了你若干不得不这么写的烂代码,头发照顾护士就靠它了,快来给它点个赞吧!

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