探索C# 10.0的关键新特性

前言

随着.NET 6的发布,C# 10.0带来了许多创新特性和改进,旨在简化编码过程,增强开发者的生产力,并提供更现代、简洁的编程体验,可以说,这些新特性不仅增强了C#的表达能力,还提高了开发者的编程效率和代码的可读性,让C#更加通俗易懂。接下来,将逐一探讨并举例说明这些关键新特性。

1. 全局 using 语句

全局using语句允许开发者在项目级别导入命名空间,从而在整个项目中无需在每个文件顶部显式声明。这有助于减少冗余和提高代码可读性。比如global using,只要全局引入了对应的项目文件,可以在任何类或方法中直接使用,无需单独import。这有点像Java引入包名,整个类无需在导入,直接使用。


global using System.Net.Http;

public class MyClass {
    public async Task<string> FetchDataAsync() {
        var client = new HttpClient();
        // ...
    }

}

2. 文件作用域命名空间

在 C# 10 之前,通常会按照如下方式声明一个命名空间,然后类定义在{}里面。

namespace MyNamespace {
    // 命名空间成员的定义
}

这种方式的缺点是:如果我们想把一个文件中的所有代码都置于同一个命名空间中,就必须在每个声明中都写出完整的命名空间前缀,如:

namespace MyNamespace {
    class MyClass {
        // 类的定义
    }

    enum MyEnum {
        // 枚举类型的定义
    }
}

如果文件中的成员较多,这样的写法显得很冗长。而且,如果我们想要把这些成员移到另一个命名空间中,也需要逐一修改所有声明中的命名空间前缀,比较麻烦。

C# 10引入了文件作用域命名空间,这样就可以在文件中定义命名空间,就不需要在每个文件中都包含相同的命名空间声明。只要在文件顶部,使用分号 ;结束,所有的类就归属到这个命名空间。其实就是Java中包名,每个类都归属自己包下,这样使得增强可读、可维护性。

namespace MyProject.MyNamespace;

public class MyClass {

}

3. Top-level statements(顶级语句)

对于简单的控制台应用或脚本,可以省略主类并将程序入口点的代码直接写在文件顶部,无需定义Program类,无需像之前输出需要定义main方法


 class Program {
     static void Main(string[] args) {        
     Console.WriteLine("Hello, World!");
    }
 }

可以看到,使用 Top-level Statements,不需要定义命名空间、类、Main 函数等。代码更加简洁明了,不需要冗余的代码

using System;

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

优点

  • 简化代码:Top-level Statements 可以减少应用程序中冗余的代码,使代码更加简洁明了。
  • 提高开发效率:使用 Top-level Statements 可以减少应用程序的开发时间,提高开发效率。

缺点

  • 可读性差:Top-level Statements 中不能定义类或函数,可能会影响代码的可读性和可维护性。
  • 不利于代码重构:Top-level Statements 中定义的变量无法被其他函数或类使用,可能会影响代码的重构

4. Init-only properties(初始化只读属性)

Init-only 属性使得在对象创建时可以赋值,但一旦创建完成就无法更改,比如 person.FirstName = “Jane”; 这将导致编译错误,因为init-only属性不能再被修改。

using System;

namespace CSharp10
{
    class Program
    {
        static void Main(string[] args)
        {
            var person = new Person(firstName: "John", lastName: "Doe");
            Console.WriteLine($"First Name: {person.FirstName}, Last Name: {person.LastName}");
        }
    }

    public record Person
    {
        public string FirstName { get; init; }
        public string LastName { get; init; }

        public Person(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }
    }
}

5. Target-typed new expressions(目标类型new表达式)

编译器现在可以根据变量的目标类型推断构造函数参数类型。在 C# 10.0 之前,如果我们要创建一个对象,需要明确指定类型,比如创建一个名为 person 的 Person 类型的对象


Person person = new Person();

而在 C# 10.0 中,我们可以这样写,使用 Target-typed new 表达式创建一个名为 person 的 Person 类型的对象


Person person = new();

可以看到,在使用 Target-typed new 表达式时,我们省略了类型名 Person,而是在 new 后面直接使用了目标类型 Person,编译器会自动推断出类型。

6. Constant interpolated strings(常量插值字符串)

常量插值就是允许在常量字符串中使用字符串插值,这在之前的 C# 版本中是不允许的。常量插值的语法和字符串插值的语法类似,但是占位符必须是常量字符串。通俗来讲,就是常量里面,某个字段可变。比如

const string Name = "John";
const string Greeting = $"Hello, {Name}!";
Console.WriteLine(Greeting); // 输出:Hello, John!

在上面的示例中,我们定义了一个常量字符串 Name 和一个使用字符串插值初始化的常量字符串 Greeting,其中占位符 Name 是一个常量字符串。

总结

其实C# 10.0还有很多新特性,以上只是C# 10.0部分重要新特性的一部分,此外还包括对可空引用类型的进一步改进、record structs等,所有这些新功能都使C#语言更加现代化和易用,感兴趣的可以通过更新到最新版本的.NET SDK来充分利用这些新特性,提升开发效率和代码质量。

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 要将C# 9.0升级到C# 10.0,你需要在Visual C#解决方案工程项目文件中进行配置。在"<PropertyGroup>" XML节点中添加"<LangVersion>10.0</LangVersion>",保存并重新加载项目解决方案。这样就可以使用C# 10.0新特性了。\[1\]在C# 10.0中,你可以使用模式匹配来对Null类型进行判断,这在处理用户信息时非常有用。例如,你可以使用if(user is not null)来判断用户是否为空,并返回相应的结果。\[2\]此外,在C# 10.0中,你还可以使用顶级语句来简化代码的编写。\[2\]如果你想了解更多关于C# 10.0的改进,你可以查看MSIL中间语言的代码,其中包含了C# 10.0的一些新特性的示例。\[3\]希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *3* [C# 9.0语法标准 “函数指针” 深度解读!](https://blog.csdn.net/liulilittle/article/details/126670649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C#: 8.0 和 9.0 常用新特性](https://blog.csdn.net/sD7O95O/article/details/115910997)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明爱吃火锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值