匿名型別是編譯器自動產生的唯讀參考型別,直接繼承 object,擁有唯讀屬性(C# 3.0 為可讀寫,後續版本建議視為不可變)。無法在原始碼中命名,僅透過 var 推斷使用。
var p1 = new { Name = "Lawnmower", Price = 495.00 };
var p2 = new { Name = "Shovel", Price = 26.95 };
// p1 = p2; // 合法:同屬性名稱、型別、順序 → 同一匿名型別
class __Anonymous1 {
private string f1; private double f2;
public string Name { get { return f1; } set { f1 = value; } }
public double Price { get { return f2; } set { f2 = value; } }
}
同一組件內,屬性名稱、型別、宣告順序完全相同的匿名物件初始化器,產生同一個匿名型別。順序敏感(影響反射、序列化)。
當屬性名稱與來源變數/成員同名時,可省略指派:
var name = "Chris";
var price = 495.00;
var product = new { name, price }; // 等同 new { Name = name, Price = price }
支援成員存取:
var p = new Point { X = 1, Y = 2 };
var coords = new { p.X, p.Y }; // 等同 new { X = p.X, Y = p.Y }
var names = customers.Select(c => new { c.Name, c.Email });
var result = Compute().Select(x => new { x.Id, x.Score, Category = x.Type.Name });
var groups = orders.GroupBy(o => new { o.CustomerId, o.OrderDate.Year });
object 或 dynamic,失去型別安全)Equals/GetHashCode/ToString 覆寫(基於所有屬性值)set,但慣例視為不可變,避免副作用new { X = null } 編譯錯誤兩個同匿名型別實例,若所有對應屬性值 Equals 為 true,則 Equals 回傳 true,GetHashCode 相同。支援正確的字典鍵、集合去重運作。
匿名型別是 C# 型別系統為「臨時資料結構」提供的輕量級方案,配合 var 與 LINQ,極大提升資料轉換表達力。善用投影初始化器,能讓查詢投影程式碼更乾淨、意圖更明確。