C#新语法

本文介绍了C#的新特性,如顶级语句,允许开发者无需声明类和Main方法即可直接编写入口代码,简化了代码结构。全局using指令减少命名空间引用的繁琐,而using声明则优化了资源管理,避免了嵌套using语句。这些都是为了提高.NETCore开发效率而引入的改进。
摘要由CSDN通过智能技术生成

首先介绍能够提升开发效率的C#的新语法;然后对.NET Core中的一些常用的基础识进行重点讲解,包括异步编程、LINQ(language integrated query,语言集成查询)等技术为了避免在本章中引入ASP.NET Core技术时增加不必要的复杂度,本章将会使用控制台项目知识点进行演示,这些知识点在ASP.NET Core中应用的时候和在控制台程序中应用是一样的

一、C#的新语法顶级语法


C#8.0、C#9.0和C#10.0中增加了很多新语法,这些新语法能够帮助开发人员更好地写代码。本节将会对几个常用的语法进行讲解。2.1.1 顶级语句在以前版本的C#语法中,即使只编写一行输出“Hello world”的C#代码,也需要创建一个C#类,并且需要为这个C#类添加Main方法,才能在Main方法中编写代码。从C#9.0始,C#增加了“顶级语句”语法,它使得可以直接在C#文件中编写入口代码,不再需要声明类和方法。在 Visual Studio 2022中,新建一个控制台程序之后,向导生成的Program.cs如图所示。最简单的C#代码

Console.WriteLine("Hello, World!");

可以看到,这样的代码比以前版本C#中的代码简洁了很多。反编译上面的程序生成的程序集,可以得到代码2-2。代码2-2 反编译后的代码

[CompilerGenerated]
internalclassProgram
{
    privatestaticvoid<Main>$(string[] args)
    {
        Console.WriteLine("Hello,World!");
    }
}

可以看到,编译器自动生成了一个Program类,并且把我们编写的代码放到这个类中。因此,顶级语句语法的功能是让编译器帮助我们简化工作。由于顶级语句只是让编译器帮助开发人员简化工作,因此同一个项目中只能有一个文件具有顶级语句。顶级语句并不是用来替代原本的Main方法的,我们仍然可以用传统的Main方法编写入口代码。在顶级语句中,可以直接使用await语法调用异步方法,而且在顶级语句文件中也可以声明方法,所示。顶级语句的高级用法

inti=1,j=2;
intw=Add(i,j);
awaitFile.WriteA11TextAsync("e:/1.txt","hello"+w);
intAdd(inti1,inti2)
{
returni1+i2;
}

二、全局using指令

在编写项目代码的时候,我们经常需要引用非常多的.NET官方及第三方的类库,而这些类库通常位于不同的命名空间下,这样就需要在每个C#文件头部编写重复的using 语句来引入这些命名空间,非常烦琐。C#10.0中增加了“全局using指令”语法,我们可以将 global 修饰符添加到任何 using 关键字前,这样通过using语句引入的命名空间就可以应用到这个项目的所有源代码中,因此同一个项目中的C#代码就不需要再去重复引入这个命名空间了。在实践中,通常创建一个专门用来编写全局using代码的C#文件,然后把所有在项目中经常用到的命名空间声明到这个C#文件中。比如,项目中经常要用到Microsoft.Data.Sqlite、System.Text.Json这两个命名空间,那么可以在该项目中创建一个 Usings.cs 文件(文件名没有特殊限制),文件内容所示。

global usíng Microsoft.Data.Sqlite;

global using System.Text.Json;

使用全局using指令,项目中的其他C#文件不需要再去单独声明这些命名空间的using语句。更令人兴奋的是,只要在*.csproj文件中加入了<ImplicitUsings>enable</ImplicitUsings>,编译器根据项目类型自动为项目隐式地增加对 System、System.Linq、Microsoft.AspNetCore.Http命名空间的引入。可见,全局using指令大大减少了项目中引入命名空间的代码量。

三、using 声明

我们知道,C#中可以用using关键字来简化非托管资源的释放,当变量离开using 作用范围后,会自动调用对象的Dispose方法,从而完成非托管资源的释放。但是,如果一段代中有很多非托管资源需要被释放,代码中就会存在多个嵌套的using语句。代码2-5中使用传统的using语法对ADO.NET对象进行释放。using的嵌套

using (varconn=newSqlConnection(connStr))
{
    conn.Open();
    using (varcmd=conn.CreateCommand())
    {
    cmd.CommandText="select * from T_Articles";
    using (SqlDataReaderreader=cmd.ExecuteReader())
        {
        while (reader.Read()){)
        }
    
    }
}

可以看到,上边代码存在多层using作用域的嵌套,因此代码结构比较复杂。在C#8及之后的版本中,可以使用简化的“using声明”语法来避免代码的嵌套,如代码2-6所示在声明变量的时候,如果类型实现了 IDisposable 或IAsyncDisposable 接口,那么可以在变声明前加上using关键字,这样当代码执行离开被using修饰的变量作用域的时候,变量指的对象的Dispose方法就会被调用。简化的using声明

usingvarconn=newSqlConnection(connstr);

conn.Open();

usingvarcmd=conn,CreateCommand();

cmd.CommandText="select * from T_Articles";

usingvarreader=cmd.ExecuteReader();

while (reader.Read()){}

由此可见,using声明语法在保证资源回收的前提下,保持了代码的优美。当然,由于使用“using声明”语法声明的变量是在离开变量作用域的时候,比如方法执行结束时,才进行资源的回收,而不是像之前使用传统using语法那样可以由开发人员定义资源的回收时机,因此在使用它的时候要避免一些可能的陷阱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值