Unterschied zwischen Expression und Func

7

Was ist der Unterschied zwischen Expression und Func? Die gleiche Aufgabe kann von beiden erreicht werden. Also, was ist der Unterschied?

    
developer 26.06.2010, 08:02
quelle

4 Antworten

13

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%     
Jon Skeet 26.06.2010, 08:07
quelle
7

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() .

    
Marc Gravell 26.06.2010 08:08
quelle
3

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.

    
Darin Dimitrov 26.06.2010 08:03
quelle
0

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.

    
Rodrick Chapman 26.06.2010 08:06
quelle

Tags und Links