C# 9.0中的目标类型新表达式:类型推断的又一进步

简介: 【1月更文挑战第16天】C# 9.0引入了目标类型新表达式,这是类型推断功能的一个重要扩展。通过目标类型新表达式,开发者在创建对象时可以省略类型名称,编译器会根据上下文自动推断所需类型。这一特性不仅简化了代码编写,还提高了代码的可读性和维护性。本文将详细介绍目标类型新表达式的语法、使用场景及其对C#编程的影响。

在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

使用场景

目标类型新表达式在多个场景中都非常有用:

  1. 在变量声明中:当变量类型已知时,可以使用目标类型新表达式来创建该类型的对象,而无需重复类型名称。

  2. 在方法调用中:当方法期望特定类型的参数时,可以使用目标类型新表达式来创建该类型的对象,并将其作为参数传递。

  3. 在LINQ查询中:在使用LINQ时,经常需要创建匿名类型或具体类型的对象。目标类型新表达式可以简化这些对象的创建过程。

结论

目标类型新表达式是C# 9.0中类型推断功能的一个重要扩展,它简化了对象的创建过程,提高了代码的可读性和维护性。通过省略冗余的类型名称,目标类型新表达式使得代码更加简洁、清晰,并减少了潜在的错误。随着C#的不断发展,我们可以期待更多类似的特性来提升编程效率和代码质量。

相关文章
|
3月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
3月前
|
开发框架 .NET 编译器
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
|
7月前
|
编译器 C#
C#之十七 局部类型
C#之十七 局部类型
17 0
|
5月前
|
开发框架 .NET C#
ASP.Net c# 正则表达式 子表达式 group
ASP.Net c# 正则表达式 子表达式 group
36 0
|
1月前
|
开发框架 .NET 编译器
C#学习相关系列之匿名方法和Lambda表达式
C#学习相关系列之匿名方法和Lambda表达式
|
1月前
|
存储 C# 开发者
C#变量类型
C#变量类型
19 0
|
3月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
37 2
|
3月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。
|
3月前
|
机器学习/深度学习 开发框架 .NET
C# 中的 Lambda 表达式:一种简洁而强大的编程工具
【1月更文挑战第6天】在现代编程中,Lambda 表达式已经成为一种非常流行的编程范式。C# 作为一种功能强大的、面向对象的编程语言,自然也不例外。Lambda 表达式在 C# 中提供了一种简洁、灵活的方式来表示匿名函数。这些函数可以被用作委托或表达式树类型,从而在各种不同的上下文中使用。
|
3月前
|
SQL 开发框架 .NET
C#进阶-LINQ表达式之投影
本篇文章我们将演示LINQ扩展包语法里的投影特性,用投影实现LINQ结果集的类型转换。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
27 0