C#新语法

C#8.0至C#10.0引入了新语法,如顶级语句简化了入口代码,全局Using减少了命名空间重复导入。同时,Using声明改进了资源管理,但需注意其作用域和顺序,避免产生陷阱。C#10还允许在类声明前直接使用namespace,使得代码更简洁。
摘要由CSDN通过智能技术生成

说明

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里面了,只是省略了大括号,看起来清爽了一点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值