匿名类型是C#中无需显式定义类名即可创建只读属性对象的语法结构,常用于LINQ查询。使用new关键字结合对象初始化器可创建匿名对象,如var person = new { Name = "Alice", Age = 30 };,编译器自动推断属性类型并生成内部类,该类具有只读属性、值相等性比较和相同属性结构下的类型一致性,适用于局部临时数据封装,但不能跨方法直接返回或修改属性。

在C#中,匿名类型是一种轻量级的语法结构,用于创建没有显式定义类名的临时对象。它通常用于LINQ查询或需要快速封装一组只读属性的场景。
什么是匿名类型?
匿名类型允许你在不声明具体类的情况下创建对象。编译器会自动生成一个包含指定属性的内部类,并为这些属性提供只读访问。该类型只能在当前程序集内部使用,且不能跨方法传递(除非用object或泛型)。
匿名类型的实例一旦创建,其属性就不能修改——因为它们是只读的,通过自动实现的get访问器暴露。
如何创建匿名类型的只读对象?
使用 new 关键字配合对象初始化语法,但省略变量名左侧的类型名称:
var person = new { Name = "Alice", Age = 30 };上面这行代码创建了一个具有两个只读属性 Name 和 Age 的匿名对象。编译器推断出属性类型(string 和 int),并生成等效于如下结构的内部类:
internal class你不能写这个类名,但它在运行时存在。
常见用途和注意事项
- 常用于 LINQ 查询中投影数据:
select new { p.FirstName, p.LastName };
- 属性名可重命名:
- 两个匿名对象如果属性名、顺序、类型相同,则编译器生成同一类型:
var b = new { X = 3, Y = 4 };
// a 和 b 是同一匿名类型
- 不能作为方法返回值直接使用(除非返回 object 或 dynamic,但会丢失静态类型优势);适合局部使用。
- 支持 Equals、GetHashCode 基于值比较(即内容相等则视为相等)。









