在C#的早期版本中,创建对象时通常需要显式指定类型名称,如下所示:
var person = new Person {
Name = "Alice", Age = 30 };
在这里,Person
是类型名称,它告诉编译器要实例化哪个类的对象。然而,在某些情况下,类型信息已经通过其他方式提供给编译器,例如方法签名、变量声明或赋值语句的左侧。在这些情况下,显式指定类型名称可能是冗余的。
C# 9.0通过引入目标类型新表达式解决了这个问题。目标类型新表达式允许开发者在创建对象时省略类型名称,编译器会根据上下文自动推断所需类型。这使得代码更加简洁、清晰。
语法和用法
目标类型新表达式的语法非常简单。在需要创建对象的地方,只需使用new
关键字后跟对象初始化器即可,无需显式指定类型名称。编译器将根据上下文推断出正确的类型。
// C# 9.0 之前的语法
Person person = new Person {
Name = "Alice", Age = 30 };
// C# 9.0 中的目标类型新表达式
Person person = new {
Name = "Alice", Age = 30 }; // 编译器将推断出类型为 Person
然而,值得注意的是,上述示例在C# 9.0中并不完全正确。实际上,目标类型新表达式的正确用法应该与类型推断结合使用,如下所示:
// 正确的目标类型新表达式用法
Person person = new() {
Name = "Alice", Age = 30 }; // 编译器将推断出类型为 Person
或者,在使用init
关键字和属性初始化器的情况下:
// Person 类定义
public class Person
{
public string Name {
get; init; }
public int Age {
get; init; }
}
// 使用目标类型新表达式
Person person = new() {
Name = "Alice", Age = 30 }; // 编译器将推断出类型为 Person,并使用 init 访问器
在这个例子中,new()
后面的对象初始化器提供了足够的信息,使得编译器能够推断出要实例化的类型是Person
。
使用场景
目标类型新表达式在多个场景中都非常有用:
在变量声明中:当变量类型已知时,可以使用目标类型新表达式来创建该类型的对象,而无需重复类型名称。
在方法调用中:当方法期望特定类型的参数时,可以使用目标类型新表达式来创建该类型的对象,并将其作为参数传递。
在LINQ查询中:在使用LINQ时,经常需要创建匿名类型或具体类型的对象。目标类型新表达式可以简化这些对象的创建过程。
结论
目标类型新表达式是C# 9.0中类型推断功能的一个重要扩展,它简化了对象的创建过程,提高了代码的可读性和维护性。通过省略冗余的类型名称,目标类型新表达式使得代码更加简洁、清晰,并减少了潜在的错误。随着C#的不断发展,我们可以期待更多类似的特性来提升编程效率和代码质量。