[c#语言]2023最新最详细的c#基础新语法介绍

c#的基础新语法

        c# 8.0、c# 9.0和c# 10.0中增加了需要的新语法,这些新语法能够帮助开发人员更好地编写代码。具体如下:

 一、顶级语句

Console.WriteLine("hello World");

反编译后的代码如下:

internal class Program
{
    private static void <Main>$(string[] args)
    {
        Console.WriteLine("Hello World");
    }
}

        可以看到,编译器自动生成一个Program类,并且把我们编写的代码放在这个类里面。因此,顶级语句语法的功能是让编译器帮助我们简化工作。

        注意:统一个项目中只能有一个文件具有顶级语句。同时顶级语句并不是代替原本的Main方法,我们仍然可以用传统的Main方法编写入口代码。

二、全局using指令

        编写项目时,经常需要应用很多的.NET官方以及第三方库,如果每个c#文件都编写重复的using语句来引入这些命名空间,非常烦琐。c# 10.0增加了“全局using指令”语法(global)。

  基本语法:

        global using 库名;

         使用全局指令后,项目中其他其他的c#文件不需要再去单独声明这些命令空间的using语句。

三、using释放资源

        在c#中using还可以用于简化非托管资源的释放,当变量离开using作用范围时,自动调用Dispose方法,实现非托管资源的释放。

        如下是使用传统using语法对ADO.NET对象进行释放:

using (var conn = new SqlConnection(connStr))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "select * from T_Articles";
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read()) { }
        }
    }
}

        可以看到代码中存在着多层using作用域的嵌套,在c# 8.0及以后的版本可以简化using声明。如下代码所示,如果类型实现了IDisposableIAsyncDisposable接口,那么可以在变量声明前加上using关键字,当执行离开using修饰的变量作用域时,变量指向对象Dispose方法就会被调用。

using var conn = new SqlConnection(connStr);
conn.Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "select * from T_Articles";
using var reader = cmd.ExecuteReader();
while (reader.Read()) { }
3.1 using释放资源陷阱

        如下代码所示,先使用File.OpenWrite方法创建一个用于写入数据到文件的流,然后再创建StreamWriter对象,并把一个字符串写入文件,最后调用ReadAllText方法读取刚才写的文件内容。

using var outStream = File.OpenWrite("D:/桌面文件/c#/csdn博客/1.txt");
using var writer = new StreamWriter(outStream);
writer.WriteLine("hello");
string s = File.ReadAllText("D:/桌面文件/c#/csdn博客/1.txt");
Console.WriteLine(s);

     可以看到执行时抛出异常  “System.IO.IOException:“The process cannot access the file 'D:\桌面文件\c#\csdn博客\1.txt' because it is being used by another process.” 这是因为outStream和writer两个变量在方法执行结束后才释放资源,程序执行到第四行时,未被释放,所以显示文件正在被占用。

        改正方法:

        一、使用传统的using语句,

        二、用花括号将需要释放的资源放到单独的作用域中(推荐)

{
    using var outStream = File.OpenWrite("D:/桌面文件/c#/csdn博客/1.txt");
    using var writer = new StreamWriter(outStream);
    writer.WriteLine("hello");
}
string s = File.ReadAllText("D:/桌面文件/c#/csdn博客/1.txt");
Console.WriteLine(s);

四、文件范围的命名空间声明

        在之前的c#中,类型必须声明在命名空间中,而从c# 10开始,c#允许编写独立的namespace代码行声明命令空间,文件所有的类型都是这个命令空间下的成员。

语法如下:

c# 10前:namespace 命名空间名称

                {

                        代码块;

                }

c# 10后:namespace 命名空间名称;

                代码块;

五、可为空的引用类型 

        在c# 8.0中提供了“可为空的引用类型”语法,可以在引用类型后加“?”修饰符声明这个类型是可为空的。

语法如下:

public string? name{get;set;} //表示此变量为可空变量,防止出现警告信息

六、记录类型(record) 

        在c# 9.0 增加了记录(record)类型的语法,编译器会自动生成EqualsGetHashcode等方法。

 record作用:

        1.自动生成全部属性的构造方法(因为是全部,所有进行初始化时,必须是全部参数赋值)

        2.自动生成Equals(),GetHashcode()方法。

        3.使用record类型提供的所有属性都是只读的。

 6.1高级的record方法(解决属性只读问题)

         也可以提供额外的构造函数:

 6.2with关键字的使用

        这只是c#新语法中的一些基本语法,后续还会更新异步编程,LINQ技术等新语法的相关内容。

猜你喜欢

转载自blog.csdn.net/lihuxie/article/details/132312437