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

C# 3.0 運算式樹:將 Lambda 表示為資料結構的強大機制

     編輯:關於C語言

核心概念:程式碼即資料

運算式樹讓 Lambda 運算式以記憶體中樹狀資料結構呈現,而非編譯為可執行 IL。這是 LINQ to SQL、Entity Framework、動態查詢建構、規則引擎的基石。

雙重身分:委派 vs 運算式樹

Func<int, int> f = x => x + 1;              // 委派:可執行程式碼
Expression<Func<int, int>> e = x => x + 1; // 運算式樹:資料結構
  • 委派:執行時呼叫 f(5) → 回傳 6
  • 運算式樹:e.Compile()(5) 先編譯再執行,或遍歷 e.Body、e.Parameters 分析結構

轉換條件

  • Lambda 可轉換為委派型別 D → 亦可轉換為 Expression<D>
  • 限制:Lambda 本體必須為運算式,不可為區塊本體(含 { return ...; })

運算式樹節點類型

System.Linq.Expressions.Expression 及其衍生類別:

  • ParameterExpression:參數節點
  • ConstantExpression:常數值
  • BinaryExpression:二元運算(+、-、==、&& 等)
  • MethodCallExpression:方法呼叫
  • MemberExpression:屬性/欄位存取
  • LambdaExpression:根節點,含 Parameters、Body

實戰應用場景

1. 動態查詢建構

Expression<Func predicate = p => p.Price > 100;
if (includeDiscontinued) 
    predicate = predicate.And(p => !p.Discontinued);
var results = db.Products.Where(predicate).ToList();

2. 遠端執行轉譯

Entity Framework 遍歷運算式樹,轉譯為 SQL:

var query = db.Users.Where(u => u.Name.StartsWith("A"));
// EF 分析運算式樹 → 生成:SELECT * FROM Users WHERE Name LIKE 'A%'

3. 規則引擎/驗證框架

var rules = new List<Expression<Func<Order, bool>>> {
    o => o.Total > 0,
    o => o.Items.Any(),
    o => o.Customer.IsActive
};
// 執行時編譯或解譯執行

4. 運算式樹訪問者模式

public class ExpressionPrinter : ExpressionVisitor {
    protected override Expression VisitBinary(BinaryExpression node) {
        Console.Write("(");
        Visit(node.Left);
        Console.Write($" {node.NodeType} ");
        Visit(node.Right);
        Console.Write(")");
        return node;
    }
}
// 遍歷並列印結構

建構運算式樹的 API

除 Lambda 隱含轉換外,可用 Expression 靜態工廠方法手動建構:

var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Add(x, Expression.Constant(1));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
var compiled = lambda.Compile(); // 動態生成 IL,效能接近靜態程式碼

效能考量

  • Compile() 有額外成本,適用於重複使用的動態邏輯
  • 單次執行優先考慮解譯或預先編譯快取
  • .NET Core / .NET 5+ 對運算式樹編譯有顯著優化

運算式樹將 C# 從「靜態編譯語言」推向「具備執行期程式碼分析與轉譯能力的語言」,是現代資料存取層、動態邏輯框架不可或缺的基礎設施。

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