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

LINQ 學習筆記(二).NET 3.x 新特性回顧(三):物件/集合初始化器、匿名型別

     編輯:關於C語言

物件初始化器

允許在建構子呼叫後,直接以大括號設定屬性/欄位:


public class Test1
{
    public string String1 { get; set; }
    public int Int1;
    public Test1() { }
    public Test1(int i) { Int1 = i; }
}

// 用法
var t0 = new Test1 { String1 = "https://xianfen.Net", Int1 = 0 };
var t1 = new Test1(0) { String1 = "https://xianfen.Net" }; // 先呼叫建構子,再設定屬性

IL 機制:先呼叫無參建構子(或指定建構子),再依序呼叫屬性 set 或設定公共欄位。因此類別必須有無參建構子(或明確呼叫有參建構子)。

集合初始化器

為實作 IEnumerable 且具 Add 方法的集合提供宣告式初始化:


List<Test1> list = new List<Test1>
{
    new Test1 { String1 = "https://xianfen.Net", Int1 = 0 },
    new Test1 { String1 = "https://www.xianfen.Net", Int1 = 1 },
    new Test1 { String1 = "https://www.bianceng.cn", Int1 = 2 }
};

IL 實作:編譯器產生暫存區域變數,逐一 Add 進集合。

匿名型別:編譯器自動產生的唯讀型別


var t3 = new { String1 = "https://xianfen.Net", Int1 = 0 };

特徵:

  • 型別名稱由編譯器生成,如 <>f__AnonymousType0`2[System.String,System.Int32]
  • 屬性唯讀(僅有 get)
  • 覆寫 Equals/GetHashCode/ToString,以屬性值為基準
  • 同一組件內相同屬性名稱/順序/型別,共用同一匿名型別

限制與爭議

  • 無法作為方法參數/回傳型別(除非用 object 或 dynamic)
  • 無法定義方法/事件
  • 跨組件邊界難以使用
  • 因此常被戲稱為「雞肋」,但在 LINQ 投影(select new { ... })中極具價值

結語

物件/集合初始化器大幅減少樣板代碼;匿名型別雖有限制,但在 LINQ 臨時資料投影場景無可替代。理解其 IL 實作有助於避開陷阱(如建構子需求、不可變性)。

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