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

C# 3.0 匿名類型:建立、型別身分與存取完整指南

     編輯:關於C#

匿名類型提供無需定義具名類別即可建立強型別物件的能力,廣泛用於 LINQ 投影、臨時資料封裝。本文系統整理建立語法、編譯器生成機制、型別身分規則、屬性存取與跨方法傳遞限制。

建立語法


// 基本建立
var person = new { Name = "oec2003", Age = 100 };

// 屬性投射(從現有物件)
class User { public string Name { get; set; } public int Age { get; set; } }
User u = new User { Name = "Tom", Age = 25 };
var projected = new { u.Name, u.Age }; // 屬性名自動推斷
  • var:必要,因匿名類型無名稱
  • new { ... }:物件初始化器語法,屬性名與值由編譯器推斷型別
  • 屬性預設唯讀(編譯器僅產生 get)

編譯器生成機制

編譯器產生內部類別(如 <>f__AnonymousType0<string, int>),包含:

  • 私有唯讀欄位(initonly)
  • 公共唯讀屬性
  • 覆寫 Equals/GetHashCode/ToString
  • 建構函式接受所有屬性值

型別身分與重用規則

同一組件內,下列條件全部滿足時重用型別:

  1. 屬性名稱相同(大小寫敏感)
  2. 屬性型別相同
  3. 宣告順序相同

var a = new { Name = "A", Age = 10 };
var b = new { Name = "B", Age = 20 };     // 同型別
var c = new { Age = 10, Name = "A" };     // 不同型別(順序不同)
var d = new { Name = "A", Age = 10L };    // 不同型別(long vs int)

a = b; // 合法
// a = c; // 編譯錯誤

屬性存取


var person = new { Name = "Tom", Age = 25 };
string name = person.Name;  // 強型別存取,IntelliSense 完整支援
int age = person.Age;

// person.Name = "Jerry"; // 編譯錯誤:屬性唯讀

跨方法傳遞限制

匿名類型無法作為方法參數型別或回傳型別宣告(因無名稱)。傳遞方式:

方式優點缺點
object簡單失去強型別,需反射或 dynamic 存取
dynamic語法自然失去編譯期檢查,執行期才報錯
泛型方法 + 樣本實例保持強型別結構變更易崩潰,屬 Hack 技巧
改用 Tuple/record/具名類別型別安全、跨組件可用需額外定義

適用場景建議

  • ✅ LINQ select new { ... } 投影
  • ✅ 區域臨時資料組合(如多表 Join 後投影)
  • ✅ 單元測試資料快速建構
  • ❌ 方法簽章參數/回傳值
  • ❌ 公用 API、跨組件傳遞
  • ❌ 需序列化/反序列化的資料傳輸
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved