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

2020-06-15 17:00:24刘景俊

一:背景

1. 讲故事

上一篇跟大家聊到了Target-typed newLambda 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才有的新玩法,后面几乎每一个新版本都在跟踪完善,我先科普一下吧。

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

大家在编码的过程中,不可能遇不到 if/else 嵌套 if/else