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

C# 3.0 匿名類型、隱式類型變量與 Lambda 表達式實戰

     編輯:關於C#

C# 3.0 引入了匿名類型、隱式類型變量(var)與 Lambda 表達式,極大提升了代碼簡潔度與可讀性,並為 LINQ 查詢奠定語法基礎。本文通過實例演示這三大特性的用法、編譯器推導機制及 IL 層面實現。

1. 隱式類型變量(var)

var 並非動態類型,而是要求編譯器根據初始化表達式推導靜態類型。所有類型在編譯期確定,保持 C# 的強類型特性。

var var1 = 1;           // int
var var2 = 2;           // int
var var3 = var1 + var2; // int
var var4 = "I'm a string."; // string

Visual Studio 智能提示可顯示推導出的實際類型,便於開發期檢查。

2. 匿名類型

匿名類型允許在 select 或對象初始化器中直接定義唯讀屬性集合,編譯器自動生成對應的密封類別,包含屬性、建構函數、Equals/GetHashCode/ToString 重寫。

範例:LINQ 查詢投影匿名類型

class UserInfo {
    public string firstname;
    public string lastname;
    public int age;
    public string address;
}

var result = from userinfo in infoList
             where userinfo.age > 20 && userinfo.age < 35
             select new { userinfo.firstname, userinfo.lastname };

foreach (var var_info in result) {
    Console.WriteLine(var_info.firstname + " " + var_info.lastname);
}

編譯器為 result 推導出 IEnumerable<匿名類型>,var_info 亦自動推導為該匿名類型,智能提示完整可用。

3. Lambda 表達式

Lambda 表達式(=>)是匿名方法的簡化語法,參數類型可隱式推導,代碼更簡潔、可讀性更高。

對比:C# 2.0 匿名方法 vs C# 3.0 Lambda

// C# 2.0 匿名方法
var result1 = infoList.FindAll(delegate(UserInfo p) { return p.age > 20 && p.age < 35; });

// C# 3.0 Lambda
var result1 = infoList.FindAll(p => p.age > 20 && p.age < 35);

p => ... 中 p 類型由 infoList 元素類型推導,=> 右側為運算式或語句塊。

複雜查詢範例:分組統計

var groupBooksNumAndClicks =
    from book in books.Tbl_books
    from type in books.Tbl_types
    where book.Type_id == type.Id
    group book by type.Name into g
    select new { type = g.Key, booksSum = g.Count(), clicksSum = g.Sum(p => p.Clicks) };

此處 p => p.Clicks 作為 Sum 的選擇器 Lambda,展現了 Lambda 在 LINQ 查詢中的核心地位。

4. 匿名類型的 IL 實現機制

使用 ildasm 檢視編譯後程序集,可見編譯器為每個匿名類型生成一個內部密封類(名稱含 <>f__AnonymousType),包含:

  • 對應屬性的私有字段與公共 get 方法
  • 帶參數建構函數
  • 重寫 Equals、GetHashCode、ToString(基於屬性值比較)

總結

  • var:編譯期靜態推導,非動態類型,配合匿名類型/LINQ 極為便利。
  • 匿名類型:編譯器自動生成不可變參考類型,適合臨時數據投影。
  • Lambda:=> 語法簡化委托編寫,類型推導強大,是 LINQ 表達式樹的基礎。

深入理解編譯器背後的降級實現,有助於在性能敏感場景做出正確判斷,並能更自信地運用現代 C# 特性。

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