C # .NET 3.5: Was ist Expression <> verwendet?
-
07-07-2019 - |
Frage
Was genau ist Ausdruck <> verwendet für in C #? Gibt es Situationen, in denen Sie Expression <> 's selbst als Objekt instanziiert würden? Wenn ja, ein Beispiel geben!
Danke!
Lösung
Expression<T>
ist fast vollständig für LINQ verwendet, aber es funktioniert nicht wurde sein. Innerhalb von LINQ, ist es in der Regel, „Capture“, der in Code ausgedrückt Logik verwendet, aber halten Sie es in Daten. Diese Daten können dann von dem LINQ-Anbieter und behandelten in geeigneter Weise untersucht werden - z.B. indem sie in SQL umgewandelt wird. Normalerweise ist die Ausdrucksbäume in LINQ werden vom Compiler aus Lambda-Ausdrücke oder Abfrageausdrücke erstellt -. Aber in anderen Fällen kann es sein, praktisch, um die API zu verwenden, um direkt selbst
Einige Beispiele von anderen Orten habe ich es benutzt und gesehen verwendet:
- In MiscUtil , Marc GRA verwendet es "generic Arithmetik" zu implementieren - wenn ein hat den betreffenden Betreiber, kann es allgemein verwendet werden.
- In UnconstrainedMelody ich es auf eine ähnliche Art und Weise verwendet, um Operationen auf Fahnen Aufzählungen zu führen, und zwar unabhängig ihrer zugrunde liegenden Typ (was als Sie vielleicht schwieriger ist zu erwarten, aufgrund
long
undulong
verschiedene Bereiche mit) - In Visuelle LINQ ich verwendete Abfrageausdrücke zu LINQ „animieren“, so können Sie sehen, was los ist. Während dies offensichtlich eine LINQ Verwendung ist, ist es nicht die traditionelle Form Logik in einer anderen Form zu übersetzen.
Andere Tipps
Im Hinblick auf der LINQ, gibt es Dinge, die Sie tun können, vielseitige LINQ-Abfragen zur Laufzeit erstellen, als Sie können rein in lambdas.
Ich habe Expression
oft als Mikro Compiler, als Alternative zu DynamicMethod
und IL verwendet. Dieser Ansatz wird stärker in .NET 4.0 ( wie auf InfoQ diskutiert), aber auch in 3.5 gibt es viel Dinge, die Sie tun können (in der Regel auf Basis von Laufzeitdaten, Konfiguration usw.):
- generic Operatoren
- Objekt Klonen
- komplexe Initialisierung
- Objektvergleich
Ich habe es auch als Teil eines mathematischen Motor für einige Arbeit, die ich mit Microsoft tat - also einen mathematischen Ausdruck analysieren ( „(x + 12) * y = z“ usw.) in einen Expression
Baum, kompilieren und ausführen .
Eine weitere interessante Anwendung (dargestellt durch Jason Bock, hier ) ist in der genetischen Programmierung; bauen Sie Ihre Kandidaten als Expression
Bäume, und Sie haben den notwendigen Code sich schnell auszuführen (nach Compile()
), aber wichtiger ist (für die genetische Programmierung), auch um Fragmente zu tauschen.
Werfen Sie einen Blick auf meiner vor und nach dem Code in meine Antwort auf eine andere Frage SO .
Zusammenfassung: Expression<>
stark vereinfacht den Code, machte es leichter zu verstehen, und sogar ein Phantom Fehler behoben