nint和Pattern matching介绍(C#)

nint

最近看C# 9.0时,发现一个有意思的关键词,就是nint,第一次看到这个,于是好奇心爆棚,就去实际操作了一下。

csharp 复制代码
nint i = 1000;
Console.WriteLine("i={0}", i);

实际结果与int的结果是一样的,那为什么还要出一个nint关键字?这个关键字的用途到底在哪里?带着问题继续去探索。

对源代码进行了查看,发现nint是IntPtr的结构体,如果你做过C#与C++之间的交互,我相信你对IntPtr是非常的熟悉,IntPtr是一个指针类型,现在直接提供关键词nint进行支持,让你能够在类型安全的前提下使用指针。

csharp 复制代码
IntPtr i = (IntPtr)1000;
Console.WriteLine("i={0}", i);

这样我就可以对我之前做的关于在C#中进行内存对齐的代码用nint进行简化了,代码如下所示:

csharp 复制代码
public unsafe struct RTCPointQuery8
        {
            public fixed float x[8];
            public fixed float y[8];
            public fixed float z[8];
            public fixed float time[8];
            public fixed float radius[8];
        }
Span<byte> stack = stackalloc byte[sizeof(RTCPointQuery8) + 32];
ref var test = ref StackAllocAligned<RTCPointQuery8>(stack, 32);

static unsafe ref T StackAllocAligned<T>(Span<byte> stack, nuint alignment) where T : unmanaged
        {
            return ref Unsafe.AsRef<T>((void*)(((nint)Unsafe.AsPointer(ref MemoryMarshal.GetReference(stack))
                + ((nint)alignment - 1)) & ~(nint)(alignment - 1)));
        }

Pattern matching improvements(模式匹配)

模式匹配是解决if-else嵌套的情形,例如:现在各个地方都在发放消费券,消费券的规则如下:

性别 年龄 地区 面值

男 <20 江苏 1800

男 <45 上海 3000

男 剩余 剩余 2000

女 <20 浙江 1800

女 <60 浙江 2500

如果使用传统的方式实现这个过程,你首先想到的是if-else,如下所示:

csharp 复制代码
public static decimal get_ticket(string sex, int age, string district)
        {
            if(sex == "男")
            {
                if(age < 20 && district == "江苏")
                {
                    return 1800;
                }
                else
                {
                    if(age < 45 && district == "上海")
                    {
                        return 3000;
                    }
                    else
                    {
                        return 2000;
                    }
                }
            }
            else
            {
                if(age < 20 && district == "浙江")
                {
                    return 1800;
                }else if(age < 60 && district == "浙江")
                {
                    return 2500;
                }
            }
            return 0;
        }

这样写倒也是可以的,就是看着不太舒服,if-else太多了,看得眼花缭乱;接下来我们使用模式匹配,看看代码会是什么样子,如下所示:

csharp 复制代码
public static decimal get_ticket_pattern(string sex, int age, string distinct)
        {
            return (sex, age, distinct) switch
            {
                ("男", < 20, "江苏") => 1800,
                ("男", < 45, "上海") => 3000,
                ("男", _, _) => 2000,
                ("女", < 20, "浙江") => 1800,
                ("女", < 60, "浙江") => 2500,
                _ => 0

            };
        }

这种简化后的代码看着让人舒服多了,这就是Pattern matching要帮助你解决的场景。

两者运行的效果是一样的,如下所示:

但是Pattern matching在转化成底层代码之后,也是if-else的模式;玩法有千万种,绝对让你瞠目结舌,就看你能不能玩出新的花样来。当然,这个特性最重要的是你要明白它的客户群体在哪里?

相关推荐
辞旧 lekkk3 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
2zcode3 小时前
运动模糊图像复原的MATLAB仿真与优化
开发语言·matlab
袁雅倩19974 小时前
当吸尘器、筋膜枪都用上Type-C,供电方案该怎么选?浅谈PD取电芯片ECP5702的应用
c语言·开发语言·支持向量机·动态规划·推荐算法·最小二乘法·图搜索算法
如果'\'真能转义说4 小时前
OOXML 文档格式剖析:哈希、ZIP结构与识别
xml·算法·c#·哈希算法
我是唐青枫4 小时前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
redis·缓存·c#·.net
Aaswk4 小时前
Java Lambda 表达式与流处理
java·开发语言·python
万邦科技Lafite5 小时前
京东item_get接口实战案例:实时商品价格监控全流程解析
java·开发语言·数据库·python·开放api·淘宝开放平台
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之字符串 --【子串查找】:[NOIP 2009 提高组] 潜伏者
c++·字符串·csp·高频考点·信奥赛·子串查找·潜伏者
Cyber4K6 小时前
【Python专项】进阶语法-系统资源监控与数据采集(1)
开发语言·python·php
初願致夕霞6 小时前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp