C# 9.0 新特性解析

举报
超梦 发表于 2024/11/12 08:37:06 2024/11/12
【摘要】 C# 9.0 是微软在2020年11月随.NET 5.0一起发布的一个重要版本,带来了许多新的特性和改进,旨在提高开发者的生产力和代码的可读性。本文将从浅入深地介绍C# 9.0的一些主要新特性,并通过代码示例来说明这些特性的使用方法和注意事项。 1. 记录类型 (Records) 1.1 概述记录类型是一种不可变的数据结构,主要用于表示数据的值。与传统的类不同,记录类型默认是不可变的,并且提...

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 常见问题及易错点

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

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。