Aracılığıyla paylaş


İfade Ağaçları (C# ve Visual Basic)

İfade ağaçlarının her düğüm olduğu bir ifade, örneğin bir ağaç benzeri veri yapısı, yöntem çağrısının veya bir ikili işlem kodu gibi temsil eden x < y.

Derleyen ve ifade ağaçlarının tarafından temsil edilen kodu çalıştırın.Bu çeşitli veritabanları ve dinamik sorguları oluşturulmasını LINQ yürütülmesini sorgular yürütülebilir kodunun, dinamik değiştirilmesini sağlar.LINQ ifadesi ağaçları hakkında daha fazla bilgi için bkz Nasıl yapılır: Dinamik Sorgular Oluşturmak için İfade Ağaçları Kullanma (C# ve Visual Basic).

İfade ağaçlarının dinamik dil çalışma zamanı (DLR) aynı zamanda Microsoft Ara dili (MSIL) yerine ifade ağaçlarının yaymak derleyici yazıcılarına sağlamak için ve dinamik dil ve .NET Framework birlikte çalışabilirlik sağlamak için kullanılır.DLR hakkında daha fazla bilgi için bkz Dinamik Dil Çalışma Zamanına Genel Bakış.

Bir ifade ağacına bir anonim lambda ifadesi temelinde veya kullanarak ifade ağaçlarının el ile oluşturabilirsiniz oluşturmak C# veya Visual Basic derleyici olabilir System.Linq.Expressions ad alanı.

İfade ağaçlarının gelen Lambda ifadeleri oluşturma

Lambda ifadesi türünde bir değişken atanmış olduğunda Expression, temsil eden lambda ifadesi bir ifade ağacı oluşturmak için kod derleyicisi yayar.

C# ve Visual Basic derleyiciler ifade ağaçlarının yalnızca lambda ifadesi (veya tek satırlı lambda) oluşturulmasına neden olabilir.Deyimi lambda (veya çok satırlı lambda) ayrıştırılamıyor.C# ' ta lambda ifadeleri hakkında daha fazla bilgi için bkz Lambda İfadeleri (C# Programlama Kılavuzu); Visual Basic için bkz: Lambda İfadeleri (Visual Basic).

Aşağıdaki kod örnekleri C# nasıl gösterir ve Visual Basic derleyiciler oluşturun temsil eden lambda ifadesi bir ifade ağacı num => num < 5 (C#) veya Function(num) num < 5 (Visual Basic).

Dim lambda As Expression(Of Func(Of Integer, Boolean)) =
    Function(num) num < 5
Expression<Func<int, bool>> lambda = num => num < 5;

İfade ağaçlarının API'yi kullanarak oluşturma

İfade ağaçlarının API'yi kullanarak oluşturmak için kullanın Expression sınıfı.Bu sınıf, örneğin, belirli türlerinin ağacı düğümleri ifade oluşturmanız statik üreteci yöntemler içerir ParameterExpression, temsil eden bir değişkeni veya parametresi, veya MethodCallExpression, yöntem çağrısının temsil eder.ParameterExpression, MethodCallExpression, ve diğer ifadesi özgü türleri ayrıca tanımlı System.Linq.Expressions ad alanı.Bu türleri Özet türünden türemesi Expression.

Aşağıdaki kod örneği temsil eden lambda ifadesi bir ifade ağacı oluşturmak nasıl kullanılacağını göstermektedir num => num < 5 (C#) veya Function(num) num < 5 (Visual Basic) API kullanarak.

' Import the following namespace to your project: System.Linq.Expressions 

' Manually build the expression tree for the lambda expression num => num < 5. 
Dim numParam As ParameterExpression = Expression.Parameter(GetType(Integer), "num")
Dim five As ConstantExpression = Expression.Constant(5, GetType(Integer))
Dim numLessThanFive As BinaryExpression = Expression.LessThan(numParam, five)
Dim lambda1 As Expression(Of Func(Of Integer, Boolean)) =
  Expression.Lambda(Of Func(Of Integer, Boolean))(
        numLessThanFive,
        New ParameterExpression() {numParam})
// Add the following using directive to your code file: 
            // using System.Linq.Expressions; 

            // Manually build the expression tree for  
            // the lambda expression num => num < 5.
            ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
            ConstantExpression five = Expression.Constant(5, typeof(int));
            BinaryExpression numLessThanFive = Expression.LessThan(numParam, five);
            Expression<Func<int, bool>> lambda1 =
                Expression.Lambda<Func<int, bool>>(
                    numLessThanFive,
                    new ParameterExpression[] { numParam });

.NET Framework 4'te ifade ağaçları API de atamaları ve denetim akışı ifadeleri döngüler, koşullu blokları gibi destekler ve try-catch engeller.API öğesini kullanarak, gelen lambda ifadeleri tarafından C# ve Visual Basic derleyiciler oluşturulabilmesi için olandan daha karmaşık bir ifade ağaçlarının oluşturabilirsiniz.Aşağıdaki örnek, bir sayı çarpımını hesaplar bir ifade ağacı oluşturmak nasıl kullanılacağını göstermektedir.

' Creating a parameter expression. 
Dim value As ParameterExpression =
    Expression.Parameter(GetType(Integer), "value")

' Creating an expression to hold a local variable.  
Dim result As ParameterExpression =
    Expression.Parameter(GetType(Integer), "result")

' Creating a label to jump to from a loop. 
Dim label As LabelTarget = Expression.Label(GetType(Integer))

' Creating a method body. 
Dim block As BlockExpression = Expression.Block(
    New ParameterExpression() {result},
    Expression.Assign(result, Expression.Constant(1)),
    Expression.Loop(
        Expression.IfThenElse(
            Expression.GreaterThan(value, Expression.Constant(1)),
            Expression.MultiplyAssign(result,
                Expression.PostDecrementAssign(value)),
            Expression.Break(label, result)
        ),
        label
    )
)

' Compile an expression tree and return a delegate. 
Dim factorial As Integer =
    Expression.Lambda(Of Func(Of Integer, Integer))(block, value).Compile()(5)

Console.WriteLine(factorial)
' Prints 120.
// Creating a parameter expression.
ParameterExpression value = Expression.Parameter(typeof(int), "value");

// Creating an expression to hold a local variable. 
ParameterExpression result = Expression.Parameter(typeof(int), "result");

// Creating a label to jump to from a loop.
LabelTarget label = Expression.Label(typeof(int));

// Creating a method body.
BlockExpression block = Expression.Block(
    // Adding a local variable. 
    new[] { result },
    // Assigning a constant to a local variable: result = 1
    Expression.Assign(result, Expression.Constant(1)),
    // Adding a loop.
        Expression.Loop(
    // Adding a conditional block into the loop.
           Expression.IfThenElse(
    // Condition: value > 1
               Expression.GreaterThan(value, Expression.Constant(1)),
    // If true: result *= value --
               Expression.MultiplyAssign(result,
                   Expression.PostDecrementAssign(value)),
    // If false, exit the loop and go to the label.
               Expression.Break(label, result)
           ),
    // Label to jump to.
       label
    )
);

// Compile and execute an expression tree. 
int factorial = Expression.Lambda<Func<int, int>>(block, value).Compile()(5);

Console.WriteLine(factorial);
// Prints 120.

Daha fazla bilgi için Visual Studio 2010 ifade ağaçlarının dinamik yöntemleriyle oluşturmak.

İfade ağaçlarının ayrıştırma

Aşağıdaki kod örneğinde nasıl ifade ağacı, gösterir temsil eden lambda ifadesi num => num < 5 (C#) veya Function(num) num < 5 (Visual Basic) kendi parçalara ayrılmış.

        ' Import the following namespace to your project: System.Linq.Expressions 

        ' Create an expression tree. 
        Dim exprTree As Expression(Of Func(Of Integer, Boolean)) = Function(num) num < 5

        ' Decompose the expression tree. 
        Dim param As ParameterExpression = exprTree.Parameters(0)
        Dim operation As BinaryExpression = exprTree.Body
        Dim left As ParameterExpression = operation.Left
        Dim right As ConstantExpression = operation.Right

        Console.WriteLine(String.Format("Decomposed expression: {0} => {1} {2} {3}",
                          param.Name, left.Name, operation.NodeType, right.Value))

        ' This code produces the following output: 
        ' 
        ' Decomposed expression: num => num LessThan 5
// Add the following using directive to your code file: 
// using System.Linq.Expressions; 

// Create an expression tree.
Expression<Func<int, bool>> exprTree = num => num < 5;

// Decompose the expression tree.
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
ParameterExpression left = (ParameterExpression)operation.Left;
ConstantExpression right = (ConstantExpression)operation.Right;

Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}",
                  param.Name, left.Name, operation.NodeType, right.Value);

// This code produces the following output: 

// Decomposed expression: num => num LessThan 5            

İfade ağaçlarının girişi

İfade ağaçlarının sabit olmalıdır.Bu, bir ifade ağacı değişiklik yapmak istiyorsanız, yeni bir ifade ağacına Varolanı kopyalayarak ve onu düğümler değiştirerek oluşturmalıdır emin anlamına gelir.Varolan ifade ağacını geçiş yapmak için bir ifade ağacı ziyaretçi kullanabilirsiniz.Daha fazla bilgi için bkz. Nasıl yapılır: İfade Ağaçlarını Değiştirme (C# ve Visual Basic).

İfade ağaçlarının derleme

Expression Türü sağlar Compile bir ifade ağacı tarafından temsil edilen yürütülebilir bir temsilci kodu derler yöntemi.

Aşağıdaki kod örneğinde bir ifade ağacı derlemek ve ortaya çıkan kodu çalıştırmak nasıl kullanılacağını göstermektedir.

' Creating an expression tree. 
Dim expr As Expression(Of Func(Of Integer, Boolean)) =
    Function(num) num < 5

' Compiling the expression tree into a delegate. 
Dim result As Func(Of Integer, Boolean) = expr.Compile()

' Invoking the delegate and writing the result to the console.
Console.WriteLine(result(4))

' Prints True. 

' You can also use simplified syntax 
' to compile and run an expression tree. 
' The following line can replace two previous statements.
Console.WriteLine(expr.Compile()(4))

' Also prints True.
// Creating an expression tree.
Expression<Func<int, bool>> expr = num => num < 5;

// Compiling the expression tree into a delegate.
Func<int, bool> result = expr.Compile();

// Invoking the delegate and writing the result to the console.
Console.WriteLine(result(4));

// Prints True. 

// You can also use simplified syntax 
// to compile and run an expression tree. 
// The following line can replace two previous statements.
Console.WriteLine(expr.Compile()(4));

// Also prints True.

Daha fazla bilgi için bkz. Nasıl yapılır: İfade Ağaçlarını Yürütme (C# ve Visual Basic).

Ayrıca bkz.

Görevler

Nasıl yapılır: İfade Ağaçlarını Yürütme (C# ve Visual Basic)

Nasıl yapılır: İfade Ağaçlarını Değiştirme (C# ve Visual Basic)

Başvuru

Lambda İfadeleri (C# Programlama Kılavuzu)

System.Linq.Expressions

Kavramlar

Dinamik Dil Çalışma Zamanına Genel Bakış

Lambda İfadeleri (Visual Basic)

Diğer Kaynaklar

İfade ağacı temel kavramları

Visual Studio 2010'dinamik yöntemleriyle ifade ağaçlarının oluşturmak

Programlama Kavramları