首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 3.0 匿名型完整指南:隱含型別建構、結構相等與投影初始化器

     編輯:關於C語言

什麼是匿名型別?

匿名型別是編譯器自動產生的唯讀參考型別,直接繼承 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 }

實戰應用場景

LINQ 投影

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 覆寫(基於所有屬性值)
  • 屬性可讀寫:C# 3.0 允許 set,但慣例視為不可變,避免副作用
  • null 型別屬性禁止:new { X = null } 編譯錯誤

Equals 與 GetHashCode 語意

兩個同匿名型別實例,若所有對應屬性值 Equals 為 true,則 Equals 回傳 true,GetHashCode 相同。支援正確的字典鍵、集合去重運作。

匿名型別是 C# 型別系統為「臨時資料結構」提供的輕量級方案,配合 var 與 LINQ,極大提升資料轉換表達力。善用投影初始化器,能讓查詢投影程式碼更乾淨、意圖更明確。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved