当前位置:首页 > 每日看点

微软宣布.NET 9全面上线,对开发者有哪些利好?

卡卷网2年前 (2024-12-13)每日看点324

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第1张

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

01、安装

首先可以在命令行中通过dotnet --list-sdks指令查看是否以安装.NET9。

微软宣布.NET 9全面上线,对开发者有哪些利好?  第2张

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第3张

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第4张

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第5张

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(); }

执行效果如下:

微软宣布.NET 9全面上线,对开发者有哪些利好?  第6张

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第7张

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第8张

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第9张

03、隐式索引访问

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

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

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

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

微软宣布.NET 9全面上线,对开发者有哪些利好?  第10张

而使用.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(); }

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

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/4279.html

分享给朋友:

相关文章

需要做一个微信小程序项目,大公司价格太高怎么办?

需要做一个微信小程序项目,大公司价格太高怎么办?

一个小程序制作开发多少钱 构建一个微信小程序大概需要花费多少资金? 一、自主开发如果选择自主开发,这里面门道可不少。 微信小程序认证费用: 300 /年 域名费用: 30 - 80 /年 服务器费用: 600 - 3000 /年 这么一…

国内比较好用的快速开发平台有哪些?

国内比较好用的快速开发平台有哪些?

低代码/零代码 快速开发平台,一直是近年来很热的一个词,各大巨头的纷纷加入也给这个赛道。题主需要一个能二次开发的低代码快速开发平台,可以试试JVS低代码(私有化)。 JVS低代码前端采用Vuex框架和Element-ui组件库,后端则基于S…

为什么大家都说手机性能永远超不过PC?

最新的天玑9400牛逼吧,堪称PC级CPU,测试成绩16W功耗能跑9500分,1.8W能跑3000分,GPU也差不多是这个情况。 手机电池一般是4000-5000毫安时,电压3.7V。 也就是说,手机正常满载5W功耗下,这个电池能支持运行4…

如何做电商行业?

如何做电商行业?

“如何做电商*开网店”跟“如何找老婆”一样,没概况条件、没明确标准,就是扯犊子。 我把话题具体一点说: 具备“两三万”启动资金、掌握“选品+上架优化”基础技能,小则月入三五千、多则上万。跟摆地摊一样,有进货的钱、也不怕苦不怕累、稍微有点生意…

有没有能够兼顾便携并且流畅运行各种AI应用的笔记本?求推荐?

有没有能够兼顾便携并且流畅运行各种AI应用的笔记本?求推荐?

看了下题主的描述,可以考虑「联想YOGA Air 15 Aura AI元启版」,今年9月底出的一款轻薄本,也通过了英特尔Evo严苛认证。 处理器用了英特尔最新的「酷睿 Ultra 7 258V」,主要亮点就是AI性能、图形处理能力和能效,很…

在追求家居美学的过程中,如何选择一款电视机,使其既具备出色的音画质又能与家居装饰相得益彰?

在追求家居美学的过程中,如何选择一款电视机,使其既具备出色的音画质又能与家居装饰相得益彰?

先看照片,你就说美不美吧? 我家这个40平的客厅东西放得不少,其中最提升观感的是各种灯光,在这么多灯光中,是不是第一眼视觉中心就落在了电视上?没错,因为这电视是非常特别的环景光电视,与显示器的神光同步一样,会随着画面的变化而变化不同的光…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。