C# 3.0 引入匿名型別,讓開發者無需預先定義類別,即可建立具名屬性的物件。廣泛用於 LINQ 投射、暫時資料封裝。本文解析語法、編譯器自動產生的 IL、限制與實務用法。
var person = new { Name = "Alice", Age = 30, City = "Taipei" };
Console.WriteLine($"{person.Name}, {person.Age}, {person.City}");
編譯器會產生一個內部密封類別(名稱如 <>f__AnonymousType0`3),特性:
get,無 set。
// 等效產生代碼(簡化)
internal sealed class <>f__AnonymousType0
{
private readonly TName _name;
private readonly TAge _age;
private readonly TCity _city;
public <>f__AnonymousType0(TName name, TAge age, TCity city)
{ _name = name; _age = age; _city = city; }
public TName Name => _name;
public TAge Age => _age;
public TCity City => _city;
public override bool Equals(object obj) => ...; // 比較所有屬性
public override int GetHashCode() => ...;
public override string ToString() => $"{{ Name = {Name}, Age = {Age}, City = {City} }}";
}
object 或 dynamic),通常搭配 var 在區域使用。new { x, y } → 屬性名自動為 x, y。[CompilerGenerated],大多序列化器不支援。select new { c.Name, OrderCount = c.Orders.Count }System.Text.Json 匿名型別序列化支援)。匿名型別是編譯器語法糖,自動產生不可變、值語意的類別,極大簡化臨時資料結構定義。理解其唯讀、同結構共用型別、區域限制等特性,能正確應用於 LINQ 與區域邏輯中。