被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.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 UUID
var guid_v4 = Guid.NewGuid();
// v7 UUID
var guid_v7 = Guid.CreateVersion7();
// v7 UUID with timestamp
var guid_v7_time = Guid.CreateVersion7(TimeProvider.System.GetLocalNow());
Console.ReadKey();
}

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

.NET9 - 新功能体验(一)的更多相关文章

  1. VS2017十五项新功能体验

    Visual Studio 2017十五项新功能体验 Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年.MVP ...

  2. Visual Studio 2017十五项新功能体验

    Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年.MVP 2017技术峰会将于这个周末(3.17)在北京举办,由 ...

  3. 最新版Swagger 3升级指南和新功能体验!

    Swagger 3.0 发布已经有一段时间了,它于 2020.7 月 发布,但目前市面上使用的主流版本还是 Swagger 2.X 版本和少量的 1.X 版本,然而作为一名合格的程序员怎么能不折腾新技 ...

  4. 个人官网第8次升级(新功能、用户体验、修复bug、系统优化)

    1.新功能. 操作日志和搜索日志的Excel报表下载. 2.用户体验. 如果是通过搜索,进入到一篇内容, 搜索关键词需要高亮. 比如,搜索"程序员"出现若干内容链接,打开链接的页面 ...

  5. 地图SDK全面升级 – 数十项新功能及优化等你来体验

    腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口.通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示.标注.绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富.交 ...

  6. 4.0 SDK Workshop 纪实:一起体验多人、多屏幕共享新功能

    在本月初,声网发布了 RTC Native SDK 4.0 版本.该版本提供了更高的开发灵活度,可明显提升实时场景开发效率,并让第三方插件开发更容易.上周六(8月20日),我们组织了一场小型的线下 W ...

  7. 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能

    前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史) ...

  8. What's new in Windows 10 Enterprise with Microsoft Edge.(Windows 10 新功能)

    What's new in Windows 10 Enterprise with Microsoft Edge --带有Edge浏览器的Windows 10 企业版的新功能 本文摘录自公司群发邮件, ...

  9. 【开源】OSharp3.0框架解说系列:新版本说明及新功能规划预览

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  10. 微信小程序0.11.122100版本新功能解析

    微信小程序0.11.122100版本新功能解析   新版本就不再吐槽了,整的自己跟个愤青似的.人老了,喷不动了,把机会留给年轻人吧.下午随着新版本开放,微信居然破天荒的开放了开发者论坛.我很是担心官方 ...

随机推荐

  1. win11(含win10)自带的一键镜像备份与还原方法

    winxp和win7时代小伙伴们备份或恢复系统时大都采用类似一键ghost类的软件制作系统盘的映像,当遇到故障时再恢复,但win10和win11其实自带有这种映像制作和还原功能,我们就再也不需要额外安 ...

  2. AWS 认证

    Data Analytics: 准备先Fundamental, 然后Udemy 上买课程,在看Exam Readiness, 然后小测试一下水平,看白皮书,最后不行就 Guru上再买课程 https: ...

  3. 8.30域横向-PTH&PTK&PTT票据传递

    知识点 Kerberos协议具体工作方法,在域中: 客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用krbtgt密码hash作为密钥),发送给kdc(域控),kdc对用户进行检测,成功之后 ...

  4. 在stable diffussion中完美修复AI图片

    无论您的提示和模型有多好,一次性获得完美图像的情况很少见. 修复小缺陷的不可或缺的方法是图像修复(inpainting).在这篇文章中,我将通过一些基本示例来介绍如何使用图像修复来修复缺陷. 需要的软 ...

  5. 鸿蒙系统(HarmonyOS)全局弹窗实现

    全局弹窗相对于自定义弹窗有以下优点: 封装更彻底,一行代码就能调用 跟组件耦合度低,只需要传入组件的UIContext对象,不需要跟自定义弹窗一样需要在组件内部实例化CustomDialogContr ...

  6. 使用VSCode搭建UniApp + TS + Vue3 + Vite项目

    uniapp是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.以及各种小程序.深受广大前端开发者的喜爱.uniapp官方也提供了自己的IDE工具HBui ...

  7. 如何将图片转换为向量?(通过DashScope API调用)

    本文介绍如何通过模型服务灵积DashScope将 图片转换为向量 ,并入库至向量检索服务DashVector中进行向量检索. 模型服务灵积DashScope,通过灵活.易用的模型API服务,让各种模态 ...

  8. Android Systrace 基础知识 -- 分析 Systrace 预备知识

    1. 正文 1.1 线程状态查看 Systrace 会用不同的颜色来标识不同的线程状态, 在每个方法上面都会有对应的线程状态来标识目前线程所处的状态,通过查看线程状态我们可以知道目前的瓶颈是什么, 是 ...

  9. Redis数据库常见命令

    Redis数据库常见命令 Linux启动Redis # 启动服务 redis-server # 开启客户端 redis-cli # 关闭redis服务 shutdown #查看服务是否运行 ping ...

  10. HOG算法的笔记与python实现

    这两篇[1][2]博客写的都非常详细.这里做个笔记记录一下. HOG称为方向梯度直方图(Histogram of Oriented Gradient),主要是为了对图像进行特征提取.所以在传统目标检测 ...