前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探索C# 10.0的关键新特性

探索C# 10.0的关键新特性

原创
作者头像
小明爱吃火锅
发布2024-02-06 12:02:49
2220
发布2024-02-06 12:02:49
举报
文章被收录于专栏:小明说Java小明说Java

前言

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

1. 全局 using 语句

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

代码语言:csharp
复制

global using System.Net.Http;

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

}

2. 文件作用域命名空间

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

代码语言:csharp
复制
namespace MyNamespace {
    // 命名空间成员的定义
}

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

代码语言:csharp
复制
namespace MyNamespace {
    class MyClass {
        // 类的定义
    }

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

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

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

代码语言:csharp
复制
namespace MyProject.MyNamespace;

public class MyClass {

}

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

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

代码语言:csharp
复制

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

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

代码语言:csharp
复制
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属性不能再被修改。

代码语言:csharp
复制
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 类型的对象

代码语言:javascript
复制

Person person = new Person();

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

代码语言:javascript
复制

Person person = new();

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

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

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

代码语言:javascript
复制
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来充分利用这些新特性,提升开发效率和代码质量。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1. 全局 using 语句
  • 2. 文件作用域命名空间
  • 3. Top-level statements(顶级语句)
    • 优点
      • 缺点
      • 4. Init-only properties(初始化只读属性)
      • 5. Target-typed new expressions(目标类型new表达式)
      • 6. Constant interpolated strings(常量插值字符串)
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com