C# 3.0 引入了匿名類型、隱式類型變量(var)與 Lambda 表達式,極大提升了代碼簡潔度與可讀性,並為 LINQ 查詢奠定語法基礎。本文通過實例演示這三大特性的用法、編譯器推導機制及 IL 層面實現。
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 智能提示可顯示推導出的實際類型,便於開發期檢查。

匿名類型允許在 select 或對象初始化器中直接定義唯讀屬性集合,編譯器自動生成對應的密封類別,包含屬性、建構函數、Equals/GetHashCode/ToString 重寫。
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 亦自動推導為該匿名類型,智能提示完整可用。

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 查詢中的核心地位。
使用 ildasm 檢視編譯後程序集,可見編譯器為每個匿名類型生成一個內部密封類(名稱含 <>f__AnonymousType),包含:
get 方法Equals、GetHashCode、ToString(基於屬性值比較)
var:編譯期靜態推導,非動態類型,配合匿名類型/LINQ 極為便利。=> 語法簡化委托編寫,類型推導強大,是 LINQ 表達式樹的基礎。深入理解編譯器背後的降級實現,有助於在性能敏感場景做出正確判斷,並能更自信地運用現代 C# 特性。