服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# 9.0新特性nint和Pattern matching的使用方法

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

2022-09-14 15:28一线码农 C#

这篇文章主要介绍了c# 9.0新特性nint和Pattern matching的使用方法,文中讲解非常细致,帮助你更好的学习c# 9.0,有需求的朋友可以参考下

一:背景

1. 讲故事

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

二:新特性研究

1. Native ints

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

?
1
2
3
Summary: nint i = 1; and nuint i2 = 2;
 
Shipped in preview in 16.7p1.

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

?
1
2
3
4
5
static void Main(string[] args)
{
 nint i = 10;
 Console.WriteLine($"i={i}");
}

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

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

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

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

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

  • 原来的写法:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [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# 9.0新特性nint和Pattern matching的使用方法

总的来说这个关键词不是最重要的,重要的是C#团队对指针操作抱有前所未有的重视,这是一个非常积极的信号。

2. Pattern matching improvements

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

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

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

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

 

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

 

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 去简化,毕竟它就是为了这种问题而生的,修改后的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
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代码是什么样子。

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

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

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

三: 总结

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

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

以上就是c# 9.0新特性nint和Pattern matching的使用方法的详细内容,更多关于c# nint和Pattern matching的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/huangxincheng/p/13111705.html

延伸 · 阅读

精彩推荐
  • C#C#图片查看器实现方法

    C#图片查看器实现方法

    本篇文章给大家分享了用C#制作图片查看器的方法以及先实现代码,有需要的读者们参考下。...

    彬菌5802022-02-22
  • C#C#集合Collections购物车Shopping Cart(实例讲解)

    C#集合Collections购物车Shopping Cart(实例讲解)

    下面小编就为大家分享一篇C#集合Collections购物车Shopping Cart的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    杨明波(Leo Yang)11722022-02-16
  • C#C# winform实现右下角弹出窗口结果的方法

    C# winform实现右下角弹出窗口结果的方法

    这篇文章主要介绍了C# winform实现右下角弹出窗口结果的方法,结合实例形式分析了C#窗口操作的相关技巧,需要的朋友可以参考下...

    廖先生6422022-01-10
  • C#C#处理Access中事务的方法

    C#处理Access中事务的方法

    这篇文章主要介绍了C#处理Access中事务的方法,涉及C#中事物的实现及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    baggio709558611732021-10-29
  • C#C#插入图片到Excel表格单元格代码详解

    C#插入图片到Excel表格单元格代码详解

    在本篇文章里小编给大家整理了关于C#插入图片到Excel表格单元格的具体方法和实例代码,需要的朋友们可以学习下。...

    sunny蓝鱼3442022-07-28
  • C#浅谈C#中的值类型和引用类型

    浅谈C#中的值类型和引用类型

    在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。下面我们来简单谈谈C#中的值类型和引用类型...

    Joye.Net8242021-11-26
  • C#C#创建安全的字典(Dictionary)存储结构

    C#创建安全的字典(Dictionary)存储结构

    本文主要对存储结构字典(Dictionary)的一些常用方法进行简单的说明,并阐述了如何创建安全的字典(Dictionary)存储结构。希望对大家有所帮助...

    彭泽090210692021-12-13
  • C#完成OSS.Http底层HttpClient重构封装 支持标准库

    完成OSS.Http底层HttpClient重构封装 支持标准库

    OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力。本篇文章主要包含 1. HttpClient的介绍,...

    KevinCC6762021-12-24