昨晚,.Net 6正式版发布,今天一早我就迫不及待的下载安装了VS2022,同时体验了一下C#10.0的各种新特性。关于.Net 6的性能提升和具体内部细节还没来得及仔细研究,先给大家分享一下.Net 6或者说C# 10.0带来的新特性及对我们开发过程的影响。
1.顶级程序
首先最直观可以看到的是当我们创建Web应用或者控制台应用的时候,我们会发现Main函数找不到了,程序编程了这个样子:
·
这其实并不是C#10.0的新特性,而是C# 9.0新特性中的“顶级程序”,只是在.Net5时使用VS默认生成的代码框架中并没有用到顶级程序的写法,而.Net 6的Web应用和控制台应用中使用了该写法。但是在.Net 6的WPF或WinForm应用默认代码中依旧维持原来的写法。
对顶级程序用法进行研究后,我发现了以下规律:
- 虽然.Net6中默认去掉了Main函数,我们依旧可以定义使用Main函数作为程序入口,但是仅限于不编写顶级函数的情况下,若存在顶级函数,则Main函数不会被默认执行。若已存在顶级程序,则自定义的Main函数不会被执行
- 如果编写了顶级程序,则会默认出现Program类,而且这个类不是运行时生成的,我们在IDE中直接就可以打出来,同时,如果你额外在无命名空间的代码处定义一个Program类则会提示需要使用partail关键字。如下图所示
-
顶级程序前或顶级函数中,不能声明类、接口、命名空间、record等内容。如果在同一文件中编写,则此类声明必须写在顶级程序后面。
2.全局引用
在C#10.0语言特性说明中,我们可以看到全局应用。为了方便大家理解和使用全局引用,我总结了以下几个特点:
- .Net6中默认存在有一部分全局引用,其使用开关为各项目csproj文件的ImplicistUsings属性,如果该值为enable,则使用默认引用,如果值为disable则不使用默认引用,如下图:
- 除默认全局引用外,我们声明自己所需要的全局引用,用法为:global using xxx; 全局引用的范围只限于其所在项目,若A项目引用B项目,B的全局引用在A中无效,同时A项目的全局引用在B中也无效。
3.同一个解构中的赋值和声明
额,,,C#10.0官方文档是这么写的,但是析构是什么东西,从文档上看明显不是析构函数,翻找资料后,发现其实这个特性针对的是tuple(元组),这东西在C#7.0中就已经出现,但是一直很少被用到,官方说法是主要应对一些需要多个输入或输出的算法。那么我们还是来看一下C#10.0在这一块更新了什么。
官方文档中对此项更新的写法是这样:
如果大家对元组不熟悉,会搞不清楚point是什么,怎么写。实际我们写出完整的例子应该是这样的
1 var point = (1, 2); 2 3 int x1 = 0; 4 int y1 = 0; 5 (x1, y1) = point; 6 7 int x2, int y2) = point; 8 9 int x3 = 0; 10 (x3, int y3) = point;
其中第3至5行和第7行的两种写法,从C#7.0到现在一直是可用的,但是第9至10行这种写法,在C#9.0及之前版本是不支持的,10.0之后,加入了对该写法的支持。
.Net6及C#10.0带来的新特性非常多,今天先写到这里,后面的特性解读我会尽快编写完成。