(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Ausdrucksbaumstrukturen (C# und Visual Basic)

Ausdrucksbaumstrukturen stellen Code in einer strukturähnlichen Datenstruktur dar, in der jeder Knoten ein Ausdruck ist, z. B. ein Methodenaufruf oder eine binäre Operation wie x < y.

Sie können durch Ausdrucksbaumstrukturen dargestellten Code kompilieren und ausführen. Dies ermöglicht dynamische Änderungen des ausführbaren Codes, die Ausführung von LINQ-Abfragen in verschiedenen Datenbanken und die Erstellung dynamischer Abfragen. Weitere Informationen zu Ausdrucksbaumstrukturen in LINQ finden Sie unter Gewusst wie: Verwenden von Ausdrucksbaumstrukturen zum Erstellen dynamischer Abfragen (C# und Visual Basic) und Exemplarische Vorgehensweise: Erstellen eines IQueryable-LINQ-Anbieters.

Ausdrucksbaumstrukturen werden auch in der Dynamic Language Runtime (DLR) verwendet, um die Interoperabilität zwischen dynamischen Sprachen und dem .NET Framework sicherzustellen und Compilerentwicklern die Ausgabe von Ausdrucksbaumstrukturen anstelle der Microsoft Intermediate Language (MSIL) zu ermöglichen. Weitere Informationen zur DLR finden Sie unter Übersicht über die Dynamic Language Runtime.

Sie können Ausdrucksbaumstrukturen basierend auf einem anonymen Lambda-Ausdruck von C#- oder Visual Basic-Compilern erstellen lassen oder mit dem System.Linq.Expressions-Namespace manuell erstellen.

Wenn ein Lambda-Ausdruck einer Variablen vom Typ Expression(Of TDelegate) zugewiesen wird, gibt der Compiler Code zum Erstellen einer Ausdrucksbaumstruktur aus, die den Lambda-Ausdruck darstellt.

Die C#- und Visual Basic-Compiler können Ausdrucksbaumstrukturen nur aus Ausdruckslambdas (oder einzeiligen Lambdas) generieren. Sie können keine Anweisungslambdas (oder mehrzeiligen Lambdas) analysieren. Weitere Informationen zu Lambda-Ausdrücken in C# und Visual Basic finden Sie unter Lambda-Ausdrücke (C#-Programmierhandbuch) bzw. Lambda-Ausdrücke (Visual Basic).

Die folgenden Codebeispiele veranschaulichen, wie Sie mit den C#- und Visual Basic-Compilern eine Ausdrucksbaumstruktur erstellen, die den Lambda-Ausdruck num => num < 5 (C#) oder Function(num) num < 5 (Visual Basic) darstellt.


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


Verwenden Sie die Expression-Klasse, um Ausdrucksbaumstrukturen mit der API zu erstellen. Diese Klasse enthält statische Factorymethoden, die Ausdrucksbaumstruktur-Knoten bestimmter Typen erstellen, z. B. einen ParameterExpression, der eine Variable oder einen Parameter darstellt, oder einen MethodCallExpression, der einen Methodenaufruf darstellt. ParameterExpression , MethodCallExpression und die anderen ausdrucksspezifischen Ausdrucksbaumstruktur-Typen werden auch im System.Linq.Expressions-Namespace definiert. Diese Typen werden vom abstrakten Typ Expression abgeleitet.

Das folgende Codebeispiel veranschaulicht, wie eine Ausdrucksbaumstruktur, die den Lambda-Ausdruck num => num < 5 (C#) oder Function(num) num < 5 (Visual Basic) darstellt, mit der API erstellt wird.



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


In .NET Framework 4 unterstützt die Ausdrucksbaumstruktur-API auch Zuweisungen und Ablaufsteuerungsausdrücke wie Schleifen, bedingte Blöcke und try-catch-Blöcke. Mit der API können komplexere Ausdrucksbaumstrukturen erstellt werden als dies mit den C#- und Visual Basic-Compilern und Lambda-Ausdrücken möglich ist. Das folgende Beispiel veranschaulicht die Erstellung einer Ausdrucksbaumstruktur, die die Fakultät einer Zahl berechnet.


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


Weitere Informationen finden Sie im Thema zum Generieren dynamischer Methoden mit Ausdrucksbaumstrukturen in Visual Studio 2010 (möglicherweise in englischer Sprache).

Das folgende Codebeispiel veranschaulicht, wie die Ausdrucksbaumstruktur, die den Lambdaausdruck num => num < 5 (C#) oder Function(num) num < 5 (Visual Basic) darstellt, in ihre Teile zerlegt werden kann.



        ' 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



Ausdrucksbaumstrukturen sollten unveränderlich sein. Das bedeutet, dass Sie eine neue Ausdrucksbaumstruktur erstellen müssen, wenn Sie eine Ausdrucksbaumstruktur ändern möchten. Dazu kopieren Sie die vorhandene Struktur und ersetzen die Knoten wie gewünscht. Sie können einen Ausdrucksbaumstruktur-Besucher verwenden, um die vorhandene Ausdrucksbaumstruktur zu durchlaufen. Weitere Informationen finden Sie unter Gewusst wie: Bearbeiten von Ausdrucksstrukturen (C# und Visual Basic).

Der Expression(Of TDelegate)-Typ stellt die Compile-Methode bereit, die den durch eine Ausdrucksbaumstruktur dargestellten Code in einen ausführbaren Delegaten kompiliert.

Das folgende Codebeispiel veranschaulicht das Kompilieren einer Ausdrucksbaumstruktur und Ausführen des resultierenden Codes.


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


Weitere Informationen finden Sie unter Gewusst wie: Ausführen von Ausdrucksbaumstrukturen (C# und Visual Basic).

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft