Net6新语法
Net6新语法
1.1 顶级语句
- 直接在C#文件中直接编写入口方法的代码,不用类,不用Main。经典写法仍然支持。反编译一下了解真相。
- 同一个项目中只能有一个文件具有顶级语句。
- 顶级语句中可以直接使用await语法,也可以声明函数
编译器帮忙生成了命名空间、类名、方法名
1.2 全局Using指令
- 将 global 修饰符添加到 using 前,这个命名空间就应用到整个项目,不用重复using。
- 通常创建一个专门用来编写全局using代码的C#文件
- 如果csproj中启用了
enable ,编译器会自动隐式增加对于System、System.Linq等常用命名空间的引入,不同各类型项目引入的命名空间也不一样。
1.3 Using声明
在实现了Idisposable/IAsyncDisposable接口的类型的变量声明前加上using当代码执行离开变量的作用域时,对象就会被释放。
{
using var outStream = File.OpenWrite("e:/1.txt");
using var writer = new StreamWriter(outStream);
}
writer.WriteLine("hello");
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);
1.4 文件范围的命名空间声明
可以省略namespace的大括号
1.5 可空引用类型
- C#数据类型分为值类型和引用类型两种,值类型的变量不可以为空,而引用类型变量可以为空
- csproj中
enable 启用可空引用类型检查
- 如果字段可能为null,编译器会警告
- 类型加 ? ,允许为null,警告消失
- 字段允许null,使用时会警告
- 消除警告的俩种方式
if非null判断和字段名后加"!"
1.6 record类型基础
(1)init 只能在构造函数内赋值
(2)在C#9.0中增加了记录(record)类型的语法,编译器会为我们自动生成Equals、GetHashcode等方法。
(3)record就是普通的一个类
(4)可以实现部分属性是只读的、而部分属性是可以读写。
(5)默认生成的构造方法的行为不能修改,我们可以为类型提供多个构造方法,然后其他构造方法通过this调用默认的构造方法
(6)record也是普通类,变量的赋值是引用的传递。这是和结构体不同之处。
(6)with关键字生成对象的副本
既可以默认p1对象的所有属性值,也可以在with里重新赋值