Was ist der Zweck der Expression-Klasse?
Frage ich mich, was genau ist der Unterschied zwischen der Verpackung eines Delegat in Expression<>
und nicht ?
Bin ich zu sehen Expression<Foo>
viel mit LinQ, aber so weit ich habe nicht gefunden, einen Artikel, der erklärt den Unterschied zwischen diesem, und nur mit Hilfe eines Delegaten.
E. g.
Func<int, bool> Is42 = (value) => value == 42;
vs.
Expression<Func<int, bool>> Is42 = (value) => value == 42;
InformationsquelleAutor der Frage Steffen | 2011-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch die Speicherung eines lambda als einen Delegaten, den Sie speichern eine bestimmte Instanz eines Delegaten, der macht irgendeine Aktion. Es kann nicht geändert werden, wenn Sie nur nennen Sie es. Sobald Sie Ihre Delegierten, Sie haben nur begrenzte Möglichkeiten, in zu überprüfen, was es tut und so weiter.
Durch die Speicherung eines lambda-als ein Ausdruck, den Sie speichern einen Ausdruck-Baum, stellt die Stellvertretung. Es kann manipuliert werden, um andere Dinge wie änderung der Parameter, ändern Sie den Körper und machen es zu tun, etwas radikal anderes. Es könnte sogar kompiliert werden wieder zu einem so delegieren Sie können es nennen, wenn Sie möchten. Sie können leicht überprüfen Sie den Ausdruck, um zu sehen, was die Parameter sind, was es tut und wie er es tut. Dies ist etwas, das eine Abfrage-Anbieter verwenden können, um verstehen und übersetzen eines Ausdrucks in eine andere Sprache (z.B. schreiben einer SQL-Abfrage für eine entsprechende expression tree).
Es ist auch viel einfacher zu erstellen, eine Stellvertretung, die dynamisch mit Ausdrücken, als es mit den code. Sie können denken, Ihren code auf einer höheren Ebene als Ausdrücke, die sehr ähnlich wie ein compiler-Ansichten-code statt going low-level und Ihre code-Ansicht als IL-Anweisungen.
Also mit einem Ausdruck, Sie sind in der Lage zu tun viel mehr als eine einfache anonymen Delegaten. Obwohl es nicht wirklich frei ist, wird die Leistung nehmen Sie einen Treffer, wenn Sie ausgeführt werden kompilierte Ausdrücke im Vergleich zu einer regulären Methode oder einer anonymen Delegaten. Aber das könnte nicht ein Problem sein, wie die weiteren Vorteile, die mithilfe von Ausdrücken können Sie wichtig sein.
InformationsquelleAutor der Antwort Jeff Mercado
Func<>
ist nur ein delegate-Typ. Ein Ausdruck ist eine runtime-Darstellung der kompletten Baum von Operationendie Optional sind, kann kompiliert werden zur Laufzeit in ein Delegierter. Es ist diese Struktur, die analysiert wird, durch den Ausdruck Parser wie Linq-to-SQL-generiert SQL-Anweisungen oder andere kluge Dinge. Bei der Zuweisung eines lambda-Ausdruck einen Ausdruck geben, erzeugt der compiler diesen Ausdruck Baum sowie die üblichen IL-code. Mehr auf Ausdruck Bäume.InformationsquelleAutor der Antwort Tim Rogers
Veranschaulichen andere Antworten, wenn Sie kompilieren diese 2 Ausdrücke und haben Blick auf den vom compiler generierten code, das ich das, was Sie sehen:
Func<int, bool> Is42 = (value) => value == 42;
Expression<Func<int, bool>> Is42 = (value) => value == 42;
InformationsquelleAutor der Antwort Ucodia
http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx
Expression tree stellt linq-Ausdruck, der analysiert werden kann und zum Beispiel verwandelte sich in SQL-Abfrage.
InformationsquelleAutor der Antwort Jakub Konecki
Ausdrucksbaumstrukturen können Sie prüfen den code in den Ausdruck, die in Ihrem code.
Zum Beispiel, wenn Sie übergeben diesen Ausdruck:
o => o.Name
code herausfinden könnte, dass dieName
Eigenschaft zugegriffen wurde innerhalb des Ausdrucks.InformationsquelleAutor der Antwort Nicholas Butler
Werden, was die anderen geschrieben haben (das ist völlig richtig) ich will hinzufügen, dass durch die
Expression
Klasse, die Sie erstellen können, neue Methoden zur Laufzeit. Es gibt einige Einschränkungen. Nicht alle Dinge, die Sie tun können, in C# kann getan werden, in einemExpression
Baum (zumindest in .NET 3.5 . Mit .NET 4.0 dazugekommen sind eine große Anzahl an möglichenExpression
"Typen"). Die Nutzung dieser sein könnte (zum Beispiel) zu erstellen, die eine dynamische Abfrage und übergeben es an LINQ-to-SQL oder Filterung basierend auf dem input der user... (man könnte dies immer mit CodeDom, wenn alles, was Sie wollte, war eine dynamische Methode, die nicht kompatibel mit LINQ-to-SQL, aber emitting direkt IL-code ist ziemlich schwierig 🙂 )InformationsquelleAutor der Antwort xanatos