承接上一篇,我們繼續深入探討 C# 3.0 引入的關鍵語言特性。這些特性不僅簡化了程式碼撰寫,更為 LINQ 的強大查詢能力奠定了基礎。
C# 3.0 新增的特性包括:
在過去,若想為 CLR 類型(如 string、List<T> 或自訂類別)新增方法,往往只能建立靜態輔助方法或透過繼承。擴充方法打破了這項限制,讓開發人員能以實例方法的語法呼叫靜態方法,彷彿該方法原本就屬於該類型。
擴充方法必須定義在 非泛型的靜態類別 中,第一個參數前加上 this 關鍵字,指明要擴充的型別。編譯器會在呼叫端自動將實例傳遞給該參數。
public static class StringExtensions
{
public static bool IsValidEmail(this string input)
{
// 簡易 Email 格式驗證
return System.Text.RegularExpressions.Regex.IsMatch(input, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
}
}
使用時如同呼叫實例方法:
string email = "user@example.com";
bool valid = email.IsValidEmail(); // 實際呼叫 StringExtensions.IsValidEmail(email)
假設我們有一個簡單的 User 類別:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
我們可以透過擴充方法為其新增格式化輸出功能,而不需修改原始類別:
public static class UserExtensions
{
public static string ToDisplayString(this User user)
{
return $"ID: {user.Id}, 姓名: {user.Name}, 年齡: {user.Age}";
}
}
呼叫方式:
var user = new User { Id = 1, Name = "YJingLee", Age = 22 };
string info = user.ToDisplayString(); // 輸出: ID: 1, 姓名: YJingLee, 年齡: 22
Lambda 運算式 (=>) 是匿名委派的簡潔語法糖,廣泛用於 LINQ 查詢條件、排序、投影等。運算式樹 (Expression<TDelegate>) 則將 Lambda 表示為資料結構,使執行階段能分析、轉譯查詢邏輯(如 LINQ to SQL 轉換為 T-SQL)。
// Lambda 運算式
Func add = (a, b) => a + b;
// 運算式樹
Expression> addExpr = (a, b) => a + b;
// 可透過 addExpr.Body 分析運算式結構
C# 3.0 的這些特性相輔相成:自動屬性與初始化器簡化資料物件建立;匿名類型與隱含類型支援即時投影;擴充方法與 Lambda 則構成了 LINQ 流暢查詢語法的骨幹。掌握它們,才能真正發揮 LINQ 的威力。