​.NET 7 中的5个亮点及新特性

.NET 7 RC1 发布
在9月14号,.NET 7 RC1正式发布了。
按照微软的说法

This is the first of two release candidates (RC) for .NET 7 that are supported in production.

从RC1开始,就是生产支持了。但是大家还是要自己小心测试一番,上生产还是要谨慎谨慎再谨慎。不过你的开源项目啥的就可以放心大胆的上了。.

同时微软也提到,建议使用Visual Studio 2022 17.4 Preview 2,如果是mac建议用Visual Studio 2022 for Mac preview。

.NET 7 Release Candidate 1 has been tested with Visual Studio 17.4 Preview 2. We recommend you use the preview channel builds if you want to try .NET 7 with Visual Studio family products. If you’re on macOS, we recommend using the latest Visual Studio 2022 for Mac preview.

同时微软也已经说了正式版的发布日期, 2022年11月8号-10号在.Net Conf 2022上正式公布.Net7。

Don’t forget about .NET Conf 2022. Join us November 8-10, 2022 to celebrate the .NET 7 release!

.NET 7的亮点

微软在博客里主要提了5点。

MAUI

.NET Multi-platform App UI (MAUI) unifies Android, iOS, macOS, and Windows APIs into a single API so you can write one app that runs natively on many platforms. .NET MAUI enables you to deliver the best app experiences designed specifically by each platform (Android, iOS, macOS, Windows, and Tizen) while enabling you to craft consistent brand experience through rich styling and graphics. Out of the box, each platform looks and behaves the way it should without any additional widgets or styling required.

就是说MAUI这个跨平台的桌面UI终于在.Net7上提供了,目前提供Android, iOS, macOS, Windows, and Tizen平台的支持。

这里注意,目前不支持Linux,但是后面可能会支持。

另外Windows上不是传统的exe,而是商店应用程序。

云原生

Cloud native is a set of best practices for building your apps for and in the cloud to take advantage of resilience, scalability, efficiency, and velocity.

在.NET 7里面我们可以通过MSBuild来直接创建Docker镜像了,不需要在写Dockerfile,目前支持的选项还不是特别多,等后面我们可以写一点相关的内容。

Arm64

ARM provides a small form factor with exceptional performance and high-power efficiency.

每代.NET 都会增加对Arm的改进,.NET 7也不例外,有大量针对Arm64的改进,多到了微软都觉得这是.Net7的一大亮点了。

现代化

Being on a modern version of .NET lets you take advantage of lightning-fast performance with a plethora of new features improving your developer quality of life.

这玩意不知道咋说了,感觉说的是迁移助手的事。大概就是说让赶紧从.Net Framework迁移过来吧,迁移过来又快又稳。

性能表现

.NET is fast. .NET 7 is the fastest .NET yet. Over a thousand performance-impacting improvements went into .NET 7 impacting reflection, On Stack Replacement(OSR), start-up time, Native AOT, loop optimizations and many other areas.

惯例,每年的.Net都是迄今为止最快的.Net,所以.Net7也不例外,通过对包括OSR、Native AOT, 反射、启动时间在内的超过1000项改进来让.Net 7变成迄今为止最快的.Net了。

不过这里面还是有不少值得拿出来说一说的,比如反射据说快了一倍,Native AOT目前虽然用起来比较麻烦,使用范围也比较窄,但是至少进入主线了。

新特性 原始字符串

在C# 11里添加了一个叫原始字符串的东西,这个东西算是我相当喜欢以及期待的功能,先来看看怎么使用?

首先,我们先来看看之前如果我们需要定义一个带引号的字符串我们需要怎么做。

var a = "\"test\"";
Console.WriteLine(a);

我们需要把每个引号都加上转义符,变成\"对吧?这种操作如果仅仅只有几个引号,那还好说,我们手动加一下就行了。

如果我们要引用一个xmljson之类的文本呢?里面可能充斥着大量的引号,我们可能就不得不借助工具先进行转换,然后再放到代码里,并且拿出来的时候还要使用工具转换回去。

现在这个原始字符串功能就可以让我们省去转换这一步,直接把字符串内容作为原始字符串放到内容里。

var test = """
"test"
""test""
""";
Console.WriteLine(test);

这里使用至少三个引号"""来作为原始字符串的开始与结束,然后我们就可以在里面随便写引号而不用进行任何转义了。有人又要问了,那我的字符串里有三个引号怎么办呢?是不是还要转义?

既然我这么问了,那么答案肯定是否定的,大家要注意我用了至少三个引号的说法,这里的至少就很有灵性。

我们可以使用四个引号、五个引号来包裹这个原始字符串,只要前后的引号数量相同即可。

var test = """"
"test"
""test""
"""test"""
"""";

Console.WriteLine(test);

同时原始字符串也支持$来支持嵌套代码。

我们同样可以用

var test = $""""
"test"
""test""
"""test"""
{a}
"""";
Console.WriteLine(test);

来使用花括号插入代码段。

同时,花括号这种东西有时候也会给我们带来烦恼,比如我们要解释一段vue代码?里面会有{{}}这种东西?同时我们又想插入代码段?

现在我们可以在原始字符串前面加任意个$,代表我们使用几个花括号来表示要插入的代码块。

var test = $$$""""
"test"
""test""
"""test"""
{{}}
{{{a}}}
"""";

Console.WriteLine(test);

这样我们就可以原样输出{{和}},并且支持{{{a}}}来输出我们的代码段。

同时原始字符串还处理了一下排版的问题。

众所周知,如果我们用@来定义字符串,那么我们换行以后就只能紧贴着最左边来写内容,如果我们想做一下对齐,那么对不起,你产生的字符串不会对齐,你加了多少个空格来对齐,输出的字符串就会给你加多少个空格。

现在原始字符串可以根据你定义的位置来去掉多余的空格。

var test = 
    $$$""""
        "test"
    ""test""
    """test"""
    {{}}
    {{{a}}}
    """";
Console.WriteLine(test);

我们直接将原始字符串的开头空一定数量的空格,那么后续所有的对齐都是按照这个空行来进行对齐。

比如我们的例子输出是这样的

    "test"
""test""
"""test"""
{{}}
"test"