C#新语法
一、顶级语句(C#9.0)
-
直接在C#文件中直接编写入口方法的代码,不用类,不用Main,经典写法仍然支持。
-
同一个项目只能有一个文件具有顶级语句。
-
顶级语句中可以直接使用await语法,也可以声明函数
二、全局Using指令(C#10)
- 将global修饰符添加到using前,这个命名空间就应用到整个项目,不用重复using。
- 通常创建一个专门来编写全局using代码的C#文件。
- 如果csproj中启用了
<ImplicitUsings>enable</ImplicitUsings>
编译器会自动隐式增加对于System、System.Linq等常用命名空间的引入,不同各类型项目引入的命名空间也不一样。
三、Using声明(C#8)
在实现了Idispoable/IAsyncDisposable接口的类型的变量声明前加上using,当代码执行离开变量的作用域时,对象就会被释放。
using SqlConnection conn = new SqlConnection("Data Source=.;InitialCatalog=db1;Integrated Security=True");
conn.Open();
using SqlCommand cmd = conn.CreatCommand();
cmd.CommandText = "select * from T";
using SqlDataReader reader = cmd.ExecuteReader();
While(reader.Read())
{
string title = reader.GetString(reader.GetOrdinal("Title"));
Concole.WriteLine(title);
}
四、文件范围的命名空间声明(C#10)
-
在之前版本的C#中,类型必须定义在namespace中。
-
namespace TMS.Admin; Class Teacher { public int Id{get;set;} public string Name{get;set;} }
五、可空引用类型(C#8)
- csproj中enable启用可空引用类型检查。
- 在引用类型后添加“?”修饰符来声明这个类型是可空的。对于没有添加“?”修饰符的引用类型的变量,如果编译器发现存在这个变量赋值null的可能性的时候,编译器会给出警告信息。
六、记录(Record)类型(C#9)
-
c#中的运算符默认是判断两个变量指向的是否是同一个对象,即使两个对象内容完全一样,也不相等。可以通过重写Equals方法、重写运算符等来解决这个问题,不过需要开发人员编写非常多的额外代码。
-
在C#9.0中增加了记录(record)类型的语法,编译器会为我们自动生成Equals、GetHashcode等方法。
public record Person(string FirstName,string LastName)
-
Person p1 = new Person("xiao","mi"); Person p2 = new Person("xiao","mi"); Person p3 = new Person("xiao","sosa"); Console.WriteLine(p1); Console.WriteLine(p1 == p2); Console.WriteLine(p1 == p3); Console.WriteLine(p1.FirstName);