Ausdrucksbäume sind Daten Repräsentationen von Logik - was bedeutet, dass sie zur Ausführungszeit von Dingen wie LINQ-Providern untersucht werden können. Sie können herausfinden, was der Code bedeutet, und möglicherweise in eine andere Form wie SQL konvertieren.
Die Func
-Typenfamilie sind jedoch nur Delegaten. Sie enden als normale IL, die direkt ausgeführt, aber nicht (einfach) untersucht werden kann. Beachten Sie, dass Sie die Ausdrucksbaumstrukturen (naja, Expression<T>
und LambdaExpression
) in Delegaten kompilieren und diese gegebenenfalls auch in verwaltetem Code ausführen können.
Sie können Ausdrucksbäume manuell mit den Factory-Methoden in der Expression-Klasse erstellen, aber normalerweise verwenden Sie nur die Tatsache, dass C # Lambda-Ausdrücke in Ausdrucksbäume und normale Delegaten konvertieren kann:
%Vor%Beachten Sie, dass es Einschränkungen gibt, nach denen Lambda-Ausdrücke in Ausdrucksbäume umgewandelt werden können. Am wichtigsten ist, dass nur Lambdas konvertiert werden können, die aus einem einzelnen Ausdruck (und nicht aus einem Anweisungskörper) bestehen:
%Vor% Es stimmt nicht, dass "sie dasselbe tun". Expression
beschreibt Ihre Absicht in einer Weise, die zur Laufzeit interpretiert werden kann - es ist, wenn Sie so wollen, das Rezept. Eine Funktion ist ein undurchsichtiger Delegat, der kann nicht überprüft werden - es kann als Blackbox verwendet werden. Im Vergleich zu einem Rezept ist es eine Art Auto-Koch, der nicht sieht, was es tut: Gib ihm etwas Brot und Hühnchen, schließe deine Augen und es gibt dir ein Sandwich, aber du lernst es nie kennen > wie .
Ich bespreche das hier mehr: Ausdruck erklären , aber das Rezept ist der Schlüssel für LINQ , RPC, usw. Und natürlich, wenn Sie das Rezept haben, können Sie Ihren eigenen Koch machen, über Expression.Compile()
.
Ausdruck kann zur Laufzeit erstellt werden, Funktion nicht (es sei denn, Sie verwenden Reflexion emittieren). Sobald Sie den Ausdrucksbaum erstellt haben, können Sie ihn kompilieren und in einen Funktionszeiger verwandeln, der aufgerufen werden kann. Func ist ein Zeiger auf eine bereits vorhandene Funktion, die nicht mehr geändert werden kann, während Ausdruck den Code einer Funktion darstellt, die nicht existiert, bis Sie sie kompiliert haben.
Normalerweise verwenden Sie Ausdrücke, wenn Sie die Semantik des Codes beibehalten möchten, damit Sie übersetzen können. Das heißt, Ausdrücke ermöglichen Ihnen, den Code als Daten zu behandeln. Wenn der Code nicht als Daten behandelt werden muss (d. H. Sie beabsichtigen nicht, ihn zu speichern oder zu übersetzen), ist die Verwendung eines Func angemessen.
Tags und Links c#