C # 4.0: Ausdrucksbäume vs. CodeDom

c# codedom expression-trees

Frage

Was sind die Unterschiede zwischen Expression-Bäumen und CodeDom? Welchen sollte ich für welches Szenario verwenden?

Akzeptierte Antwort

Expressionsbäume haben viel gemeinsam mit (zum Beispiel) einem AST . Es wird nicht direkt dem Code zugeordnet, ist aber sehr gut für die Erstellung von Algorithmen geeignet. Zum Beispiel, wenn Sie eine Formel analysieren:

((a + 2) / b)

das ist:

((a + 2) / b)

Tatsächlich habe ich genau das getan, indem ich einen Parser benutzt habe, der einen Objektbaum erstellt, wobei Objekte den vollständigen Ausdruck über eine "Besucher" -Implementierung erzeugen. In .NET 4.0 ermöglicht die umfassendere Unterstützung für den Ausdrucksbaum die Unterstützung der meisten Szenarien und deren bedarfsgerechte Kompilierung.

Eine weitere wichtige Verwendung von Ausdrücken besteht darin, dass Sie sie zur Laufzeit dekonstruieren können. In Ihrem Code könnten Sie also Folgendes haben:

((a + 2) / b)

und extrahiere die SomeMethod Methode-Info, 1 und "abc" etc.


kodierte Karten zum Code . Es geht um Anweisungen usw., die sehr ähnlich sind, wie Sie normalen Code schreiben würden. Die gebräuchlichste Verwendung von codedom ist die Codegenerierung als Teil von Werkzeugen. Sie können es für die dynamische Zusammenstellung verwenden, aber um ehrlich zu sein, ist es schwieriger. Ich bin kein Fan. Das schöne ist , dass ein CodeDOM Baum könnte für mehrere Sprachen arbeiten.


Ein anderer Kandidat hier sollte DynamicMethod und / oder ILGenerator . Dies wird nicht einem AST (Ausdruck) zugeordnet und kann nicht zum Generieren von Quellcode (codedom) verwendet werden, sondern ermöglicht den vollständigen Zugriff auf die MSIL-Tools. Natürlich erfordert es auch, dass Sie in Bezug auf Stacks usw. denken, aber es ist sehr effizient und effektiv für Meta-Programmierung.


Wenn ILGenerator zu hart ist und codedom eine PITA ist, ist eine andere Option die Laufzeitgenerierung von Code als String . Dann übergeben Sie das durch CSharpCodeProvider , um es zu kompilieren. Es gibt Teile der XmlSerializer , die dies tun ( XmlSerializer IIRC).


Also zusammenfassen:

  • Meta-Programmierung: ILGenerator oder CSharpCodeProvider ; auch Expression in 4.0 (aber das ist in 3.5 ziemlich begrenzt)
  • Umgang mit AST: Expression
  • Analyse zur Laufzeit: Expression
  • Code-Generierung in mehreren Sprachen: code-dom

Beliebte Antwort

Ausdrucksbäume werden zum Erstellen von Ausdrücken verwendet. Quellcode zur Laufzeit erstellen CodeDom wird zum Kompilieren von Quellcode verwendet. Es muss existieren, bevor Sie es bauen können. Ausdrucksbäume sind flexibler, aber viel schwieriger zu verwenden.

Wenn Sie Skripts zu Ihrer Anwendung hinzufügen möchten, verwenden Sie CodeDom. Wenn Sie sehr fortgeschrittene Reflexionen und dergleichen durchführen möchten, verwenden Sie Ausdrucksbäume, aber ich empfehle es nicht.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum