信息发布→ 登录 注册 退出

C#的匿名类型是什么?如何创建临时的只读对象?

发布时间:2025-11-17

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

在C#中,匿名类型是一种轻量级的语法结构,用于创建没有显式定义类名的临时对象。它通常用于LINQ查询或需要快速封装一组只读属性的场景。

什么是匿名类型?

匿名类型允许你在不声明具体类的情况下创建对象。编译器会自动生成一个包含指定属性的内部类,并为这些属性提供只读访问。该类型只能在当前程序集内部使用,且不能跨方法传递(除非用object或泛型)。

匿名类型的实例一旦创建,其属性就不能修改——因为它们是只读的,通过自动实现的get访问器暴露。

如何创建匿名类型的只读对象?

使用 new 关键字配合对象初始化语法,但省略变量名左侧的类型名称:

var person = new { Name = "Alice", Age = 30 };

上面这行代码创建了一个具有两个只读属性 NameAge 的匿名对象。编译器推断出属性类型(string 和 int),并生成等效于如下结构的内部类:

internal class e__AnonType0 { public string Name { get; } public int Age { get; } public e__AnonType0(string name, int age) { Name = name; Age = age; } }

你不能写这个类名,但它在运行时存在。

常见用途和注意事项

  • 常用于 LINQ 查询中投影数据:
var results = from p in people
select new { p.FirstName, p.LastName };
  • 属性名可重命名:
var item = new { FullName = person.Name, YearsOld = person.Age };
  • 两个匿名对象如果属性名、顺序、类型相同,则编译器生成同一类型:
var a = new { X = 1, Y = 2 };
var b = new { X = 3, Y = 4 };
// a 和 b 是同一匿名类型
  • 不能作为方法返回值直接使用(除非返回 object 或 dynamic,但会丢失静态类型优势);适合局部使用。
  • 支持 EqualsGetHashCode 基于值比较(即内容相等则视为相等)。
基本上就这些。匿名类型帮你快速构造临时只读数据容器,简洁又安全。
标签:# var  # 重命名  # 这行  # 自动生成  # 并为  # 它在  # 就不能  # 适用于  # 帮你  # 你在  # 是一种  # linq  # 对象  # c#  # 泛型  # 访问器  # internal  # public  # class  # 数据封装  # int  # select  # 封装  # Object  # String  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!