Skip to content

C# 9.0 新特性

2020 年 11 月, C# 9 正式发布

顶级语句

顶级语句从许多应用程序中删除了不必要的流程。 请考虑规范的“Hello World!”程序:

C#
using System;

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

只有一行代码执行所有操作。 借助顶级语句,可使用 using 指令和执行操作的一行替换所有样本:

C#
using System;

Console.WriteLine("Hello World!");

如果需要单行程序,可删除 using 指令,并使用完全限定的类型名称:

C#
System.Console.WriteLine("Hello World!");

记录类型

C# 9.0 引入了记录类型。 可使用 record 关键字定义一个引用类型,用来提供用于封装数据的内置功能。 通过使用位置参数或标准属性语法,可以创建具有不可变属性的记录类型:

C#
public record Person(string FirstName, string LastName);

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

此外,还可以创建具有可变属性和字段的记录类型:

C#
public record Person
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
};

虽然记录可以是可变的,但它们主要用于支持不可变的数据模型。 记录类型提供以下功能:

  • 用于创建具有不可变属性的引用类型的简明语法
  • 行为对于以数据为中心的引用类型非常有用:
    • 值相等性
    • 非破坏性变化的简明语法
    • 用于显示的内置格式设置
  • 支持继承层次结构

可使用结构类型来设计以数据为中心的类型,这些类型提供值相等性,并且很少或没有任何行为。 但对于相对较大的数据模型,结构类型有一些缺点:

  • 它们不支持继承。
  • 它们在确定值相等性时效率较低。 对于值类型,ValueType.Equals 方法使用反射来查找所有字段。 对于记录,编译器将生成 Equals 方法。 实际上,记录中的值相等性实现的速度明显更快。
  • 在某些情况下,它们会占用更多内存,因为每个实例都有所有数据的完整副本。 记录类型是引用类型,因此,记录实例只包含对数据的引用。

调整和完成功能

还有其他很多功能有助于更高效地编写代码。 在 C# 9.0 中,已知创建对象的类型时,可在 new 表达式中省略该类型。 最常见的用法是在字段声明中:

C#
private List<WeatherObservation> _observations = new();

当需要创建新对象作为参数传递给方法时,也可使用目标类型 new。 请考虑使用以下签名的 ForecastFor() 方法:

C#
public WeatherForecast ForecastFor(DateTime forecastDate, WeatherForecastOptions options)

可按如下所示调用该方法:

C#
var forecast = station.ForecastFor(DateTime.Now.AddDays(2), new());

此功能还有一个不错的用途是,将其与仅限 init 的属性组合使用来初始化新对象:

C#
WeatherStation station = new() { Location = "Seattle, WA" };

可使用 return new(); 语句返回由默认构造函数创建的实例。

C# 8.0 及版本历史记录

你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度