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

C# 3.0 新特性:匿名型別與隱含型別區域變數 (var)

     編輯:關於C#

C# 3.0 引入 匿名型別 與 隱含型別區域變數 (var),兩者緊密配合,簡化臨時資料結構定義與 LINQ 查詢投射。

隱含型別區域變數 (var)

  • 非動態型別:編譯期由指派運算式右側推斷具體型別,IL 中為實際型別。
  • 限制:僅限區域變數 (方法內);必須初始化;不可為 null (無法推斷);不可改變推斷型別 (如 var i=5; i="s" 錯誤)。
  • 適用場景:匿名型別 (無法寫出型別名稱)、LINQ 查詢結果、泛型建構冗長時 (如 var dict = new Dictionary>())。
  • 建議:型別明顯時 (如 var s = "str") 仍建議顯式宣告以提升可讀性。

匿名型別


var person = new { Name = "Yuyi", Age = 20, Skills = new[] { "C#", "SQL" } };
// 編譯器產生內部密封類別:
// <>f__AnonymousType0`3
// 屬性唯讀:Name, Age, Skills
  • 不可繼承、不可為 null (參考型別可為 null 但結構體不可)、僅限方法範圍內使用 (無法作為參數/回傳型別)。
  • 結構相等:編譯器覆寫 Equals/GetHashCode/ToString,逐屬性比較。
  • 型別同一性:同一組件內,屬性名稱、順序、型別完全相同 的匿名型別實例共享同一編譯器產生型別。不同順序/名稱/數量 → 不同型別。
  • 避免型別爆炸:大量結構不一致的匿名型別會產生大量編譯器型別,增加載入開銷。

var 與匿名型別的必要結合

匿名型別無名稱,必須搭配 var 讓編譯器推斷型別:


var q = from c in customers
        where c.City == "Taipei"
        select new { c.Name, c.Email, OrderCount = c.Orders.Count };
// q 型別為 IEnumerable<匿名型別>
foreach (var item in q) Console.WriteLine(item.Name);

投射至已知型別

若需跨方法傳遞,請投射至具名型別 (DTO/Record):


public record CustomerSummary(string Name, string Email, int OrderCount);
var list = q.Select(x => new CustomerSummary(x.Name, x.Email, x.OrderCount)).ToList();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved