C# 9.0 新特性解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。

C# 9.0 是微软在2020年11月随.NET 5.0一起发布的一个重要版本,带来了许多新的特性和改进,旨在提高开发者的生产力和代码的可读性。本文将从浅入深地介绍C# 9.0的一些主要新特性,并通过代码示例来说明这些特性的使用方法和注意事项。
image.png

1. 记录类型 (Records)

1.1 概述

记录类型是一种不可变的数据结构,主要用于表示数据的值。与传统的类不同,记录类型默认是不可变的,并且提供了自动实现的相等性和哈希码计算。

1.2 代码示例

public record Person(string FirstName, string LastName);

class Program
{
   
    static void Main(string[] args)
    {
   
        var person1 = new Person("John", "Doe");
        var person2 = new Person("John", "Doe");

        Console.WriteLine(person1 == person2); // 输出: True
    }
}

1.3 常见问题及易错点

  • 不可变性:记录类型的属性默认是只读的,不能在创建后修改。

  • with 表达式:可以使用 with 表达式来创建记录类型的副本,并修改其中的部分属性。

    var person3 = person1 with {
          LastName = "Smith" };
    

2. 初始化器增强 (Init Only Setters)

2.1 概述

初始化器增强允许在对象初始化时设置属性,但之后不能再修改这些属性。

2.2 代码示例

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

class Program
{
   
    static void Main(string[] args)
    {
   
        var person = new Person {
    FirstName = "John", LastName = "Doe" };
        // person.FirstName = "Jane"; // 编译错误
    }
}

2.3 常见问题及易错点

  • 初始化时机:只能在对象初始化时设置 init 属性,之后不能再修改。
  • 构造函数:可以在构造函数中设置 init 属性,但一旦对象创建完成,这些属性就不可再修改。

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

3.1 概述

顶级语句允许在程序入口点直接编写代码,而不需要显式定义 Main 方法。

3.2 代码示例

using System;

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

3.3 常见问题及易错点

  • 单一入口点:顶级语句只能存在于一个文件中,通常用于简单的控制台应用程序。
  • 复杂逻辑:对于复杂的逻辑,建议仍然使用传统的 Main 方法。

4. 模式匹配增强 (Pattern Matching Enhancements)

4.1 概述

C# 9.0 对模式匹配进行了增强,引入了更多的模式类型,如关系模式和逻辑模式。

4.2 代码示例

public class Person
{
   
    public string Name {
    get; set; }
    public int Age {
    get; set; }
}

class Program
{
   
    static void Main(string[] args)
    {
   
        var person = new Person {
    Name = "John", Age = 30 };

        if (person is {
    Age: > 18 })
        {
   
            Console.WriteLine($"{person.Name} is an adult.");
        }

        if (person is {
    Age: < 18 } or {
    Age: > 60 })
        {
   
            Console.WriteLine($"{person.Name} is not in the working age.");
        }
    }
}

4.3 常见问题及易错点

  • 模式组合:可以使用 andor 组合多个模式。
  • 类型检查:模式匹配不仅限于属性检查,还可以用于类型检查。

5. 目标类型的新表达式 (Target-typed New Expressions)

5.1 概述

目标类型的新表达式允许省略 new 关键字后面的类型,编译器会根据上下文推断出类型。

5.2 代码示例

List<int> numbers = new() {
    1, 2, 3, 4, 5 };

5.3 常见问题及易错点

  • 类型推断:编译器会根据赋值的目标类型推断出 new 表达式的类型。
  • 适用范围:适用于集合初始化和其他需要显式指定类型的场景。

6. 属性模式 (Property Patterns)

6.1 概述

属性模式允许在模式匹配中直接访问对象的属性。

6.2 代码示例

public class Person
{
   
    public string Name {
    get; set; }
    public int Age {
    get; set; }
}

class Program
{
   
    static void Main(string[] args)
    {
   
        var person = new Person {
    Name = "John", Age = 30 };

        if (person is {
    Name: "John", Age: 30 })
        {
   
            Console.WriteLine("Found John Doe.");
        }
    }
}

6.3 常见问题及易错点

  • 多属性匹配:可以同时匹配多个属性。
  • 嵌套模式:支持嵌套模式匹配。

7. 空值处理 (Null-coalescing Assignment Operator)

7.1 概述

空值处理操作符 ??= 允许在变量为 null 时为其赋值。

7.2 代码示例

string name = null;
name ??= "Default";

Console.WriteLine(name); // 输出: Default

7.3 常见问题及易错点

  • 短路行为:如果变量不为 null,则不会执行赋值操作。
  • 性能优化:避免不必要的赋值操作,提高性能。

总结

C# 9.0 引入了许多新的特性和改进,旨在提高开发者的生产力和代码的可读性。通过本文的介绍,希望读者能够对这些新特性有一个基本的了解,并在实际开发中合理利用它们。当然,每个特性都有其适用场景和注意事项,开发者在使用时应结合具体需求进行选择和应用。

目录
相关文章
|
8天前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
20 2
|
11天前
|
PHP 开发者
PHP 7新特性深度解析及其最佳实践
【10月更文挑战第31天】本文将深入探讨PHP 7带来的革新,从性能提升到语法改进,再到错误处理机制的变革。我们将通过实际代码示例,展示如何高效利用这些新特性来编写更加健壮和高效的PHP应用。无论你是PHP新手还是资深开发者,这篇文章都将为你打开一扇窗,让你看到PHP 7的强大之处。
|
11天前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用
|
14天前
|
Kubernetes Cloud Native 调度
云原生批量任务编排引擎Argo Workflows发布3.6,一文解析关键新特性
Argo Workflows是CNCF毕业项目,最受欢迎的云原生工作流引擎,专为Kubernetes上编排批量任务而设计,本文主要对最新发布的Argo Workflows 3.6版本的关键新特性做一个深入的解析。
|
21天前
|
PHP 数据安全/隐私保护 开发者
PHP 7新特性解析与实践
【10月更文挑战第20天】本文将深入浅出地介绍PHP 7的新特性,包括性能提升、语法改进等方面。我们将通过实际代码示例,展示如何利用这些新特性优化现有项目,提高开发效率。无论你是PHP新手还是资深开发者,都能从中获得启发和帮助。
|
13天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
31 0
|
6月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
192 3
|
6月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
197 3
|
13天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
28 3
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。

推荐镜像

更多