记录(Record)类型
public record Person(string FirstName, string LastName);
- 适用场景:当需要创建不可变的数据结构,且希望自动生成 GetHashCode 和 Equals 方法时。
- 不适用场景:当数据结构需要可变性或继承时。
Init-only 属性
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
- 适用场景:创建在构造后不可更改的属性。
- 不适用场景:属性需要在对象创建后修改。
顶级程序(Top-level programs)
Console.WriteLine("Hello, World!");
- 适用场景:快速编写简单的脚本或示例代码。
- 不适用场景:需要复杂程序结构的大型项目。
模式匹配增强
var result = obj switch
{
string s => s.Length,
int i => i * 2,
_ => 0
};
- 适用场景:处理多种类型的数据,需要根据类型执行不同操作。
- 不适用场景:处理单一类型或不需要根据类型进行不同操作的场景。
属性模式的增强
var person = new { Name = "John", Age = 30 };
var age = person switch
{
{ Age: var a } => a,
_ => 0
};
- 适用场景:在模式匹配中提取对象的属性。
- 不适用场景:不需要对对象属性进行特殊处理的场景。
列表模式
var numbers = new List<int> { 1, 2, 3 };
var isThreeElements = numbers switch
{
[1, 2, 3] => true,
_ => false
};
- 适用场景:检查列表是否具有特定的元素结构。
- 不适用场景:处理非列表数据结构或不需要检查元素结构的场景。
异步流(Async Streams)
public async IAsyncEnumerable<int> GenerateNumbersAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(100);
yield return i;
}
}
- 适用场景:异步生成数据序列。
- 不适用场景:同步数据生成或不需要异步处理。
目标类型新成员(Target-typed new expressions)
var person = new("John", "Doe");
- 适用场景:简化对象创建,当编译器可以推断出对象类型时。
- 不适用场景:需要明确指定类型或编译器无法推断类型时。