C# 9.0
新特性
更新: 2023-12-08 12:20:48 字数: 0 字 时长: 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
及版本历史记录
更新: 2023-12-08 12:20:48 字数: 0 字 时长: 0 分钟