共用方式為


匿名型別 (C# 程式設計手冊)

更新: 2008 年 7 月

匿名型別提供便利的方式將唯讀屬性集封裝至單一物件,而不用先明確定義型別。型別名稱是由編譯器產生,而且在來源程式碼層級中無法使用。屬性的型別是由編譯器推斷。下列範例顯示要用名為 Amount 和 Message 的兩個屬性初始化的匿名型別。

var v = new { Amount = 108, Message = "Hello" };

匿名型別通常用於查詢運算式的 select 子句中,以從來源序列的各個物件傳回屬性子集。如需查詢的詳細資訊,請參閱 LINQ 查詢運算式 (C# 程式設計手冊)

匿名型別是使用 new 運算子並搭配物件初始設定式所建立。如需物件初始設定式的詳細資訊,請參閱物件和集合初始設定式 (C# 程式設計手冊)

匿名型別是 class 型別,由一個或多個公用唯讀屬性組成。不允許其他類型的類別成員,例如方法或事件。匿名型別不可轉換成物件以外的任何介面或型別。

最常見的案例是使用其他型別的屬性初始化匿名型別。在下列範例中,假設名為 Product 的類別包含 Color 和 Price 屬性以及您不感興趣的一些其他屬性。Products 是 Product 物件的集合。匿名型別宣告是以 new 關鍵字開頭。它會初始化只使用 Product 的兩個屬性的新型別。這會使查詢只傳回更少量的資料。

如果您未指定匿名型別中的成員名稱,編譯器會提供匿名型別成員與要對其進行初始化之屬性相同的名稱。您必須提供名稱給要以運算式初始化的屬性。

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

匿名型別指派給變數時,該變數必須以 var 建構函式進行初始化。這是因為只有編譯器可以存取匿名型別的基礎名稱。如需 var 的詳細資訊,請參閱隱含型別區域變數 (C# 程式設計手冊)

備註

匿名型別是直接從物件衍生的參考型別。雖然您的應用程式無法存取匿名型別,編譯器還是會提供名稱。從 Common Language Runtime 的角度來看,匿名型別只除了不能轉換成物件以外的任何型別,與其他任何參考型別並無不同。

如果兩個或兩個以上的匿名型別有相同編號以及相同順序的屬性型別,編譯器會將它們視為相同型別,且這些匿名型別會共用相同編譯器產生的型別資訊。

匿名型別有方法範圍。若要在方法界限外傳遞匿名型別或包含匿名型別的集合,您必須先將型別轉型為物件。但是,這無法用於強型別的匿名型別。如果您必須在方法界限外儲存或傳遞查詢結果,請考慮使用一般的具名結構或類別,而不使用匿名型別。

匿名型別無法包含不安全的型別做為屬性。

因為匿名型別上的 EqualsGetHashCode 方法是根據屬性的 Equals 和 GetHashcode 定義,相同匿名型別的兩個執行個體只有在其所有屬性都相等時才會相等。

請參閱

概念

C# 程式設計手冊

LINQ 查詢運算式 (C# 程式設計手冊)

參考

物件和集合初始設定式 (C# 程式設計手冊)

其他資源

使用 C# 撰寫 LINQ 入門

變更記錄

日期

記錄

原因

2008 年 7 月

在簡介文字和「備註」一節加入轉換限制的相關資訊。

資訊加強。