目标类型的new表达式
C# 9.0 引入了一个新的语言特性:Target-typed new 表达式。这个特性使得创建新对象更加方便和直观。本文将详细介绍 Target-typed new 表达式及其在 C# 中的使用。
# 什么是 Target-typed new 表达式?
Target-typed new 表达式是 C# 9.0 中的一个新特性,它允许我们省略类型名,而是使用 new
表达式后面的目标类型(Target Type)来推断类型。也就是说,我们可以在使用 new
创建对象时不指定具体的类型,而是通过上下文推断出类型。
在 C# 9.0 之前,如果我们要创建一个对象,需要明确指定类型:
// 创建一个名为 person 的 Person 类型的对象
Person person = new Person();
而在 C# 9.0 中,我们可以这样写:
// 使用 Target-typed new 表达式创建一个名为 person 的 Person 类型的对象
Person person = new();
可以看到,在使用 Target-typed new 表达式时,我们省略了类型名 Person
,而是在 new
后面直接使用了目标类型 Person
,编译器会自动推断出类型。
# Target-typed new 表达式的使用
Target-typed new 表达式可以用于创建任何类型的对象,包括类、结构体、数组等。
# 创建类的对象
// 创建一个名为 person 的 Person 类型的对象
Person person = new();
// 创建一个名为 customer 的 Customer 类型的对象
Customer customer = new();
# 创建结构体的对象
// 创建一个名为 point 的 Point 结构体的对象
Point point = new(10, 20);
# 创建数组
// 创建一个名为 numbers 的 int 数组,长度为 5
int[] numbers = new int[5];
// 创建一个名为 names 的 string 数组,包含 "Alice" 和 "Bob" 两个元素
string[] names = new[] { "Alice", "Bob" };
# Target-typed new 表达式和可空值类型
在 C# 中,可空值类型(Nullable Value Types)是指具有 null 值语义的值类型。在使用 Target-typed new 表达式创建可空值类型对象时,需要在 new
表达式后面添加 ?
。
// 创建一个名为 nullableInt 的 int? 类型的对象
int? nullableInt = new();
// 创建一个名为 nullablePoint 的 Point? 类型的对象
Point? nullablePoint = new(10, 20);
# Target-typed new 表达式的局限性
虽然 Target-typed new 表达式使得代码更加简洁和直观,但它也存在一些局限性。
首先,Target-typed new 表达式不能用于创建匿名类型的对象。在创建匿名类型时,我们仍然需要显式指定类型。
// 错误示例:无法使用 Target-typed new 表达式创建匿名类型的对象
var person = new { Name = "Alice", Age = 20 };
其次,Target-typed new 表达式不能用于创建泛型类型的对象。在创建泛型类型的对象时,我们仍然需要显式指定类型参数。
// 错误示例:无法使用 Target-typed new 表达式创建泛型类型的对象
List<string> list = new();
# 总结
在 C# 9.0 中,Target-typed new 表达式是一个非常方便的语言特性,它使得代码更加简洁、易读和易于维护。我们可以在使用 new
创建对象时省略类型名,而是使用 new
表达式后面的目标类型来推断类型。Target-typed new 表达式适用于创建类、结构体、数组等类型的对象,但不能用于创建匿名类型和泛型类型的对象。