说明
1、C#8.0、C#9.0和C#10.0中增加了很多的新语法、这里讲解常用、重点的新语法。
2、部分语法只有VS2022及以上版本才支持,使用VS2022+.NET6
顶级语句(C#9.0)
1、直接在C#文件中直接编写入口方法的代码、不用类,不用Main。经典写法仍然支持。反编译一下了解真相
2、同一个项目中只能有一个文件具有顶级语句
3、顶级语句中可以直接使用await语法,也可以声明函数
反编译生成的代码:
由此可见,编译器生成了Program类,Main方法,只不过不用我们自己去写了,编译器就给搞定了
全局Using指令(C#10)
1、将global修饰符添加到using前,这个命名空间就应用到整个项目,不用重复using
2、通常创建一个专门用来编写全局using代码的C#文件。
3、如果csproj中启用了<ImplicitUsing>enable</ImplicitUsing>,编译器会自动隐式增加对于System、System.Linq等常用命名空间的引入,不同各类型项目引入的命名空间也不一样
Using资源管理的问题
1、复习:实现了IDisposible接口的对象可以用using进行管理
2、问题:如果一段代码中有很多非托管资源需要被释放的话,代码中就会存在着多个嵌套的using语句
Usings声明(C#8)
在实现了IDisposable/IAsyncDisposable接口的类型的变量声明前加上using,当代码执行离开变量的作用域时,对象就会被释放
using SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=db1;Integrated Security=True") ;
conn.Open();
using SqlCommand cmd = conn.CreateCommand() ;
cmd.CommandText = "select * from T_Articles";
using SqlDataReader reader = cmd.ExecuteReader() ;
while (reader.Read())
{
string title = reader.GetString(reader.GetOrdinal("Title"));
Console.WriteLine(title);
}
循环介绍一次作用域结束一次,Dispose一次,所以,Dispose两次
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);
会报异常,因为文件正在写入,没有Dispose,所以无法读取文件
怎么解决?
用传统的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);
人工造一个作用域
{
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);
文件范围的命名空间声明(C#10)
1、在之前版本的C#中,类型必须定义在namespace中。
namespace TMS.Admin;
class Teacher
{
public int Id { get; set; }
public string Name { get set; }
}
看起来class和namespace变成了平级关系,但class还是属于namesqace里面了,只是省略了大括号,看起来清爽了一点