Bagikan melalui


Pohon Ekspresi (Visual Basic)

Pohon ekspresi mewakili kode dalam struktur data seperti pohon, di mana setiap simpul adalah ekspresi, misalnya, panggilan metode atau operasi biner seperti x < y.

Anda dapat mengkompilasi dan menjalankan kode yang diwakili oleh pohon ekspresi. Ini memungkinkan modifikasi dinamis kode yang dapat dieksekusi, eksekusi kueri LINQ di berbagai database, dan pembuatan kueri dinamis. Untuk informasi selengkapnya tentang pohon ekspresi di LINQ, lihat Cara: Menggunakan Pohon Ekspresi untuk Membangun Kueri Dinamis (Visual Basic).

Pohon ekspresi juga digunakan dalam runtime bahasa dinamis (DLR) untuk memberikan interoperabilitas antara bahasa dinamis dan .NET Framework dan untuk memungkinkan penulis kompilator memancarkan pohon ekspresi alih-alih bahasa perantara umum (CIL). Untuk informasi selengkapnya tentang DLR, lihat Gambaran Umum Runtime Bahasa Dinamis.

Anda dapat membuat pengompilasi C# atau Visual Basic membuat pohon ekspresi untuk Anda berdasarkan ekspresi lambda anonim, atau Anda dapat membuat pohon ekspresi secara manual dengan menggunakan System.Linq.Expressions namespace.

Membuat Pohon Ekspresi dari Ekspresi Lambda

Saat ekspresi lambda ditetapkan ke variabel jenis Expression<TDelegate>, pengkompilasi memancarkan kode untuk membangun pohon ekspresi yang mewakili ekspresi lambda.

Pengkompilasi Visual Basic hanya dapat menghasilkan pohon ekspresi dari lambda ekspresi (atau lambda baris tunggal). Ini tidak dapat mengurai pernyataan lambda (atau lambda multibaris). Untuk informasi selengkapnya tentang ekspresi lambda di Visual Basic, lihat Ekspresi Lambda.

Contoh kode berikut menunjukkan cara membuat pengkompilasi Visual Basic membuat pohon ekspresi yang mewakili ekspresi Function(num) num < 5lambda .

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

Membuat Pohon Ekspresi dengan Menggunakan API

Untuk membuat pohon ekspresi dengan menggunakan API, gunakan Expression kelas . Kelas ini berisi metode pabrik statis yang membuat simpul pohon ekspresi dari jenis tertentu, misalnya, ParameterExpression, yang mewakili variabel atau parameter, atau MethodCallExpression, yang mewakili panggilan metode. ParameterExpression, MethodCallExpression, dan jenis khusus ekspresi lainnya juga didefinisikan dalam System.Linq.Expressions namespace. Jenis-jenis ini berasal dari jenis Expressionabstrak .

Contoh kode berikut menunjukkan cara membuat pohon ekspresi yang mewakili ekspresi Function(num) num < 5 lambda dengan menggunakan API.

' 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})

Di .NET Framework 4 atau yang lebih baru, API pohon ekspresi juga mendukung penugasan dan ekspresi alur kontrol seperti perulangan, blok bersyarkat, dan try-catch blok. Dengan menggunakan API, Anda dapat membuat pohon ekspresi yang lebih kompleks daripada yang dapat dibuat dari ekspresi lambda oleh pengkompilasi Visual Basic. Contoh berikut menunjukkan cara membuat pohon ekspresi yang menghitung faktorial angka.

' 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.

Untuk informasi selengkapnya, lihat Membuat Metode Dinamis dengan Pohon Ekspresi di Visual Studio 2010, yang juga berlaku untuk versi Visual Studio yang lebih baru.

Mengurai Pohon Ekspresi

Contoh kode berikut menunjukkan bagaimana pohon ekspresi yang mewakili ekspresi lambda Function(num) num < 5 dapat diurai ke dalam bagian-bagiannya.

' 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

Kekekalan Pohon Ekspresi

Pohon ekspresi harus tidak dapat diubah. Ini berarti bahwa jika Anda ingin mengubah pohon ekspresi, Anda harus membuat pohon ekspresi baru dengan menyalin yang sudah ada dan mengganti simpul di dalamnya. Anda dapat menggunakan visitor pohon ekspresi untuk menelusuri pohon ekspresi yang ada. Untuk informasi selengkapnya, lihat Cara: Memodifikasi Pohon Ekspresi (Visual Basic).

Mengkompilasi Pohon Ekspresi

Jenis Expression<TDelegate> menyediakan metode Compile yang mengkompilasi kode yang diwakili oleh pohon ekspresi menjadi delegasi yang dapat dieksekusi.

Contoh kode berikut menunjukkan cara mengkompilasi pohon ekspresi dan menjalankan kode yang dihasilkan.

' 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.

Untuk informasi selengkapnya, lihat Cara: Menjalankan Pohon Ekspresi (Visual Basic).

Lihat juga