C# 匿名类型的使用小结

 更新时间:2026年06月20日 09:29:25   作者:叫我少年  
本文介绍了C#匿名类型的核心概念、用法及适用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

匿名类型提供了一种快捷方式,将一组只读属性封装到单个对象中,无需先显式定义命名类型。类型名称由编译器在编译时生成,源代码中无法直接访问。

  1. 声明与推断:一行代码创建数据容器
  2. LINQ 投影:匿名类型的主要阵地
  3. 值相等性:相同属性自动相等
  4. 匿名类型 vs 元组:什么时候选哪个

一、基本声明

使用 new 运算符与对象初始值设定项结合来创建。

var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"{person.Name} is {person.Age} years old.");
// 输出:Alice is 30 years old.

推断的属性名称

当使用变量或成员访问表达式初始化时,编译器自动推断属性名称:

string productName = "Laptop";
decimal price = 999.99m;

var product = new { productName, price };
Console.WriteLine($"{product.productName}: {product.price:C}");
// 输出:Laptop: $999.99

代码解析: 不需要写 Name = productName——编译器从变量名推断属性名为 productName

必须使用var

由于类型名称不可见,必须使用 var 来声明:

var person = new { Name = "Alice", Age = 30 };
// 不能写成:AnonymousType person = ...  // 类型名不存在

二、在 LINQ 查询中使用

匿名类型最常见的用途是 LINQ 的 select 子句中的投影——只提取需要的属性子集。

var words = new[] { "apple", "blueberry", "cherry" };

var results = words.Select(w => new { Word = w, Length = w.Length });

foreach (var item in results)
    Console.WriteLine($"{item.Word} has {item.Length} letters.");

// 输出:
// apple has 5 letters.
// blueberry has 9 letters.
// cherry has 6 letters.

划重点: 这是匿名类型的核心场景。你不需要为每个查询结果定义一个 DTO 类——一行代码搞定。

三、相等性

具有相同属性名称和类型的两个匿名类型实例会共享编译器生成的同一类型。编译器自动重写 EqualsGetHashCode,基于属性值比较:

var a = new { Name = "Alice", Age = 30 };
var b = new { Name = "Alice", Age = 30 };
var c = new { Name = "Bob", Age = 25 };

Console.WriteLine(a.Equals(b));  // True —— 相同类型、相同值
Console.WriteLine(a.Equals(c));  // False —— 值不同

注意: 属性名称相同但顺序不同的匿名类型被视为不同类型——编译器按照属性名和顺序生成类型。

四、嵌套匿名类型

匿名类型可以包含其他匿名类型:

var order = new
{
    OrderId = 1,
    Customer = new { Name = "Alice", City = "Seattle" },
    Total = 150.00m
};

Console.WriteLine($"Order {order.OrderId} for {order.Customer.Name} in {order.Customer.City}");
// 输出:Order 1 for Alice in Seattle

五、特性总结

特性
编译器生成类型internal sealed class,派生自 Object
属性可访问性所有属性 public只读
支持的结构with 表达式、基于值的 Equals/GetHashCode/ToString
表达式树✅ 支持(元组不支持)

局限性

  • 不能作为方法返回类型、方法参数或字段类型(无法命名)
  • 作用域限定在声明它们的方法内
  • 不能添加方法、事件或自定义运算符
  • 属性始终只读

六、匿名类型 vs 元组

维度匿名类型元组
类型类别引用类型值类型
作用域方法内可跨方法
表达式树✅ 支持❌ 不支持
解构
属性可写性只读可读写(默认)
语法简洁度new { ... }(...)
推荐场景LINQ to SQL / 表达式树新代码的通用数据分组

决策建议: 对于大多数新代码,优先使用元组——性能更好、语法更简洁、支持解构。只在与表达式树(Entity Framework 的 Select 投影、动态 LINQ 查询)打交道时,匿名类型仍是不可替代的。

最后

匿名类型像是一个"方法内部的 DTO"。在 LINQ 查询中投影中间结果时非常方便,但一出了方法边界就无能为力。新代码中元组已经替代了匿名类型的大部分场景,把它当作 LINQ 投影的专用工具就好。

到此这篇关于C# 匿名类型的使用小结的文章就介绍到这了,更多相关C# 匿名类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 微信开发--企业转账到用户

    微信开发--企业转账到用户

    本文主要介绍了微信开发--企业转账到用户的实现方法与步骤。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • C#下Newtonsoft.Json的具体使用

    C#下Newtonsoft.Json的具体使用

    Newtonsoft.Json是一个非常流行的C# JSON 序列化和反序列化库,它可以方便地将C#对象转换为JSON 格式,或者将 JSON 数据解析为 C# 对象,下面就来介绍一下具体使用
    2025-07-07
  • Unity shader实现自由放大缩小效果

    Unity shader实现自由放大缩小效果

    这篇文章主要为大家详细介绍了Unity shader实现自由放大缩小效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • WPF实现自定义窗体的示例代码

    WPF实现自定义窗体的示例代码

    .Net默认的窗体样式只有四种,而且都比较“丑”,但是很多时候,我们希望自定义窗体,比如,无边框,有阴影等,所以本文为大家介绍了WPF实现自定义窗体的方法,希望对大家有所帮助
    2023-09-09
  • C#byte数组传入C操作方法

    C#byte数组传入C操作方法

    在本篇内容中小编给大家分享了关于C#byte数组传入C操作方法以及相关知识点,需要的朋友们学习下。
    2019-02-02
  • C#操作字符串方法总结实例代码

    C#操作字符串方法总结实例代码

    这篇文章主要介绍了C#操作字符串方法总结实例代码,需要的朋友可以参考下
    2017-10-10
  • C#和Java有什么区别和联系

    C#和Java有什么区别和联系

    这篇文章主要介绍了C#和Java有什么区别和联系的相关资料,本文介绍的非常详细,涉及到rsa语法,c#和java互转方面的知识点,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • C#用Topshelf创建Windows服务的步骤分享

    C#用Topshelf创建Windows服务的步骤分享

    这篇文章主要给大家介绍了关于C#如何利用Topshelf创建Windows服务的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • c# 实例——绘制波浪线(附源码)

    c# 实例——绘制波浪线(附源码)

    这篇文章主要介绍了c#如何绘制波浪线,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • WPF自定义实现IP地址输入控件

    WPF自定义实现IP地址输入控件

    这篇文章主要给大家介绍了关于WPF自定义实现IP地址输入控件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用WPF具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论