.NET9 - 新功能体验(一)

embedded/2024/11/22 0:26:06/

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了,今天想和大家一起体验一下新功能。

在这里插入图片描述

此次.NET 9在性能、安全性和功能等方面进行了大量改进,包含了数千项的修改,今天主要和大家一起体验我们常用有变化的功能。

01、安装

首先可以在命令行中通过dotnet --list-sdks指令查看是否以安装.NET9
在这里插入图片描述

安装方式主要有两种,第一种通过直接下载.NET9 SDK安装。

在这里插入图片描述

第二种方式通过更新IDE Visual Studio至17.12.0或之后的版本,比如我的IDE是17.11.6,选择更新即可,如果是更老的版本,比如17.11.4则需要更新两次才行。

在这里插入图片描述

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

在这里插入图片描述

02、新的转义序列

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

ESC (Escape) 字符(ASCII 编码值为 27,十六进制为 0x1b)是一种控制字符,可以用于 终端控制和文本格式化。它本身代是不可见字符,主要作用标志着后续字符序列的开始,这些序列会指定终端执行特定的操作,如改变文本颜色、设置文本样式、清屏、移动光标等。

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

static void Main(string[] args)
{var colorRed = "\x1b[31m红色文本";Console.WriteLine(colorRed);Console.ReadKey();
}

执行效果如下:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

03、隐式索引访问

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

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

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

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

在这里插入图片描述

而使用.NET9则可以。

04、params参数增强

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

public static void PrintNumbers(params int[] numbers) { }
public static void PrintNumbers(params List<string> numbers) { }
public static void PrintNumbers(params HashSet<int> numbers) { }
public static void PrintNumbers(params SortedSet<int> numbers) { }
public static void PrintNumbers(params IList<int> numbers) { }
public static void PrintNumbers(params ICollection<int> numbers) { }
public static void PrintNumbers(params IEnumerable<int> numbers) { }
public static void PrintNumbers(params Span<int> numbers) { }
public static void PrintNumbers(params ReadOnlySpan<int> numbers) { }

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

public static void PrintNumbers(params Dictionary<int, int> numbers) { }
public static void PrintNumbers(params SortedList<int, int> numbers) { }
public static void PrintNumbers(params LinkedList<int> numbers) { }
public static void PrintNumbers(params Queue<int> numbers) { }
public static void PrintNumbers(params Queue numbers) { }
public static void PrintNumbers(params Stack<int> numbers) { }
public static void PrintNumbers(params Stack numbers) { }
public static void PrintNumbers(params Hashtable numbers) { }

05、锁对象

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

新的Lock类型会使得代码更干净、更安全、更高效。

在新的锁定机制中EnterScope替换了Monitor底层实现。同时它遵循Dispose模式返回ref struct,因此可以与using语句结合使用。

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

// .NET 9 之前
public class LockExampleNET9Before
{private readonly object _lock = new();public void Print(){lock (_lock){Console.WriteLine("我们是老的锁");}}
}
// .NET 9
public class LockExampleNET9
{private readonly Lock _lock = new();public void Print(){lock (_lock){Console.WriteLine("我们是 .NET 9 新锁");}}public async Task LogMessageAsync(string message){using (_lock.EnterScope()){Console.WriteLine("我们是 .NET 9 新锁,可以和using一起使用");}}
}

06、生成UUID v7

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

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

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

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

static void Main()
{// v4 UUIDvar guid_v4 = Guid.NewGuid();// v7 UUIDvar guid_v7 = Guid.CreateVersion7();// v7 UUID with timestampvar guid_v7_time = Guid.CreateVersion7(TimeProvider.System.GetLocalNow()); Console.ReadKey();
}

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner


http://www.ppmy.cn/embedded/139470.html

相关文章

webstorm中 ‘@/**‘报 未安装模块 无法Ctrl定位

接触前端不深 学习中遇到这个问题 记录一下 创建一个名为 jsconfig.json 的文件 内容为以下 { "compilerOptions": {"baseUrl": "./","paths": {"/*": ["src/*"]}},"exclude": ["node_modul…

python读取Oracle库并生成API返回Json格式

一、安装必要的库 首先&#xff0c;确保已经安装了以下库&#xff1a; 有网模式 pip install flask pip install gevent pi install cx_Oracle离线模式&#xff1a; 下载地址&#xff1a;https://pypi.org/simple/flask/ # a. Flask Werkzeug-1.0.1-py2.py3-none-any.whl J…

前端反向代理的配置和實現

反向代理是位於客戶端和服務器之間的一個中間層&#xff0c;它代表客戶端向伺服器發起請求&#xff0c;然後將伺服器的回應返回給客戶端。與傳統的正向代理不同&#xff0c;反向代理是由伺服器端配置的&#xff0c;客戶端通常不知道它的存在。在前端開發中&#xff0c;反向代理…

GitLab 部署和配置指南

GitLab 部署和配置指南 1. GitLab 容器配置概述 在部署 GitLab 时&#xff0c;可能涉及以下几部分内容&#xff1a; 内置 Nginx 的配置和调整。HTTPS 证书的申请、使用和续期。通过 FRP 映射内网服务到外部服务器。阿里云服务器的 Nginx 配置和反向代理。 本文将完整涵盖这…

如何使用ChatGPT写推荐信?

写一封推荐信可能是一项艰巨的任务,尤其是当您不确定要包含什么或如何表达您的想法时。值得庆幸的是,在 ChatGPT 等 AI 技术的帮助下,这个过程可以变得更加顺畅和高效。在本指南中,我们将探讨如何利用 ChatGPT 的力量用简单的英语制作引人注目的推荐信。 开始 在深入研究…

开源A书签管理工具:Hoarder

在日常浏览网页时&#xff0c;我们经常会遇到一些有价值的文章、工具或者资源。 虽然浏览器的书签功能可以帮助我们保存这些链接&#xff0c;但随着时间推移&#xff0c;书签往往会变得杂乱无章&#xff0c;想要找到特定内容时却无从下手。 普通的书签管理器又缺乏智能化功能…

计算机网络在线测试-概述

单项选择题 第1题 数据通信中&#xff0c;数据传输速率&#xff08;比特率&#xff0c;bps&#xff09;是指每秒钟发送的&#xff08;&#xff09;。 二进制位数 &#xff08;我的答案&#xff09; 符号数 字节数 码元数 第2题 一座大楼内的一个计算机网络系统&#xf…

GCC是用什么语言编写的?编程语言出现之前,编译器或解释器用什么语言编写?GCC和G++有什么区别?

GCC是用什么语言编写的? 早期是C语言&#xff0c;后来改为C&#xff0c;源代码&#xff1a;https://github.com/gcc-mirror/gcc. GCC编译器从C语言转向C也经历过不顺&#xff0c;皓哥 GCC 用 C 来编译 | 酷 壳 - CoolShell 就有提到2012年GCC就转向用C编译器编译&#xff0c;…