.NET 9 新功能体验

[复制链接]
查看144 | 回复0 | 2024-11-24 09:44:32 | 显示全部楼层 |阅读模式
>

前言

微软最近发布了被誉为"迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本"——.NET 9。经过一周的时间,现在让我们一起来探索和体验这一新版本带来的诸多改进和新功能。

.NET 9 在性能优化、安全性提升和功能增强方面做出了大量的改进,涉及数千项更新。本文将重点介绍一些常用的、有显著变化的功能,帮助在实际开发中更好地利用这些新特性。

1、安装

安装方式主要有两种:

直接下载 .NET 9 SDK 安装

.NET 下载(https://dotnet.microsoft.com/download) 并下载 .NET 9 SDK。

按照安装向导完成安装。

通过更新 IDE Visual Studio 至 17.12.0 或之后的版本

打开 Visual Studio,进入"帮助" -> "检查更新"。

如果当前版本是 17.11.6,选择更新即可。

如果是更老的版本,如 17.11.4,则需要更新两次才能达到 17.12.0。

再次执行 dotnet --list-sdks 命令,确认已安装成功,结果如下:

dotnet --list-sdks

输出示例:

3.1.401 [C:\Program Files\dotnet\sdk]
5.0.401 [C:\Program Files\dotnet\sdk]
6.0.100 [C:\Program Files\dotnet\sdk]
7.0.100 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]
9.0.100 [C:\Program Files\dotnet\sdk]

2、新的转义序列

本次 C# 13 新引入了 \e 作为 ESC (Escape) 字符 Unicode U+001B 的字符文本转义序列。而以前使用的是 \u001b\x1b

ESC (Escape) 字符(ASCII 编码值为 27,十六进制为 0x1b)是一种控制字符,主要用于终端控制和文本格式化。它可以用于改变文本颜色、设置文本样式、清屏、移动光标等。

我们举一个例子,比如 ESC[31m 表示把文本颜色设置为红色,我们把 ESC 改为转义序列,代码如下:

执行效果如下:

如果单独使用 ESC (Escape) 字符的转义序列则表示其后接着的字符不可见,我们可以用 \u001b\x1b 看看效果,结果如下,发现字符没有展示出来:

var escapeU = "\u001b";
var escapeX = "\x1b";
Console.WriteLine(escapeU);
Console.WriteLine(escapeX);Console.ReadKey();

然后我们把 \u001b\x1b 改为 \u001b1\x1b1,再看一下效果:

从上图可以发现,使用 \u001b1 结果还是 \u001b 后面一个字符看不见,而使用 \x1b1 后变成问号"?"了,这是因为 \x1b1 整体被识别为一个更长的十六进制序列,而不是单纯的控制字符了,这就产生了歧义,因此不建议使用 \x1b,因而这次新增了转义字符 \e,效果如下:

3、隐式索引访问

现在对象初始值设定项表达式中允许隐式"从末尾开始"索引运算符 [^]

我们来看一个例子,首先创建了一个 ImplicitIndex 类并且包含一个 Numbers 属性,该属性是一个长度为 5 的整数数组。

现在我们可以在初始化类 ImplicitIndex 时初始化属性 Numbers,并使用"从末尾开始"索引运算符来填充数组值。

在 .NET 8 中的效果如下,鼠标移到错误上可以看到老版本是不支持该功能的:

而使用 .NET 9 则可以:

var index = new ImplicitIndex
{
    Numbers = { 12345 }
};
Console.WriteLine(index.Numbers[^1]); // 输出: 5

4、params 参数增强

之前 params 只支持数组,而现在 params 参数支持更多的集合类型,包括 SpanReadOnlySpanIEnumerable 等等。这使得我们可以更加灵活地传入集合参数,而不用先把集合转成数组后再传输。

params 关键字允许方法接收一个可变数量的参数,通常是单一类型的参数集合。params 的参数通常可以是数组、集合或其他实现了 IEnumerable 接口的类型,但有一些限制,比如以下类型虽然实现了 IEnumerable 接口,但不受支持:

5、锁对象

本次更新引入了新的锁类型 System.Threading.Lock,用于实现互斥。在之前的版本中通常通过 object 类型进行加锁,而现在有了专门的 Lock 类型用来加锁。

新的 Lock 类型会使得代码更干净、更安全、更高效。在新的锁定机制中,EnterScope 替换了 Monitor 底层实现。

同时它遵循 Dispose 模式返回 ref struct,因此可以与 using 语句结合使用。

我们一起来看看下面的代码示例:

6、生成 UUID v7

我们经常在实体中使用 Guid 作为主键,并且通过 Guid.NewGuid() 可以很方便地生成一个新的 Guid,而此方法生成的 Guid 是依据 UUID 第四个版本规范生成的。

当前已经可以通过 Guid.CreateVersion7() 方法创建 UUID 第七个版本,这个版本的 UUID 主要功能就是包含了时间戳,数据结构如下:

|48位时间戳|12位随机 |62位随机|

这也意味着 v7 版本的 UUID 可以按时间排序了,在数据库中使用起来更方便,同时 Guid.CreateVersion7() 方法还有一个重载方法接收 DateTimeOffset 类型时间戳,用来通过指定时间创建 UUID。

总结

通过本文的介绍和示例,相信你已经对 .NET 9 的新特性有了初步的了解。希望这些新功能能够在开发工作中提高效率,提升应用的性能和用户体验。如果你有任何问题或建议,欢迎在评论区留言交流。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

作者:IT规划师

出处:cnblogs.com/hugogoos/p/18559710
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!



END



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则