Was sind die Unterschiede zwischen Ausdruck Bäumen und CodeDom? Welche sollte ich für welches Szenario verwenden?C# 4.0: Ausdruck Bäume vs. CodeDom
Antwort
Ausdruck Bäume haben viel gemeinsam mit (zum Beispiel) 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 parsen:
((a + 2)/b)
das ist:
ParameterExpression a = ..., b = ...
var body = Expression.Divide(
Expression.Add(a, Expression.Constant(2)),
b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics
In der Tat, ich genau dies getan habe, mit einem Parser, der einen Objektbaum bauen, mit Objekten zu erzeugen der vollständige Ausdruck über eine "Besucher" -Implementierung. 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
ist, dass man dekonstruieren zur Laufzeit, so in Ihrem Code Sie haben könnten:
Foo(x => x.SomeMethod(1, "abc"));
und extrahieren Sie die SomeMethod
Methode-Info, 1
und "abc"
usw.
CodeDOM Karten zu Code. Es geht um Aussagen usw., sehr ähnlich, wie Sie normalen Code schreiben würden. Die gebräuchlichste Verwendung von codedom ist die Codegenerierung als Teil von Werkzeugen. Sie können verwenden Sie es für die dynamische Zusammenstellung, aber um ehrlich zu sein ist es schwieriger. Ich bin kein Fan. Das nette Feature ist, dass ein codedom Baum für mehrere Sprachen arbeiten kann.
hier Ein weiterer Anwärter sollte DynamicMethod
und/oder ILGenerator
sein. Diese nicht Zuordnung zu einem AST (Ausdruck), und kann nicht verwendet werden, um Quellcode (codedom) zu generieren, sondern ermöglicht den vollen 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
ist zu hart-Kern und CodeDOM ist ein PITA, dann eine andere Option ist Runtime Generierung von Code als String. Dann geben Sie das durch CSharpCodeProvider
, um es zu kompilieren. Es gibt Teile der Kernlaufzeit, die dies tun (XmlSerializer
IIRC).
Um es zusammenzufassen:
- Meta-Programmierung:
ILGenerator
oderCSharpCodeProvider
; auchExpression
in 4,0 (aber das ist ganz in 3,5 begrenzt) - Handhabung AST:
Expression
- Parsen zur Laufzeit:
Expression
- Codegenerierung in mehreren Sprachen: Code-dom
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 Scripting 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.
- 1. C# Dynamische Methode - IL vs Ausdruck Bäume
- 2. Reflection.Emit vs CodeDOM
- 3. C# CodeDom Automatische Eigenschaft
- 4. Suffix Arrays vs Suffix Bäume
- 5. Ausdruck Bäume Linq erhalten Wert eines Parameters?
- 6. Binäre Suche Bäume C++
- 7. B-Bäume C mit
- 8. N-äre Bäume in C
- 9. Lambda-Ausdruck vs Functor in C++
- 10. C# - null vs "Ausdruck nicht auswerten kann"
- 11. ASP.NET MVC vs. ASP.NET 4.0
- 12. Generieren Sie C# automatische Eigenschaften mit Codedom
- 13. Gibt es einen offiziellen Ersatz für CodeDom?
- 14. C# 4.0 Dynamisch vs Expando ... wo passen sie?
- 15. Expression/Statement Bäume
- 16. Lambda-Ausdruck vs Methodenreferenz
- 17. erwarten Aussage vs. Ausdruck
- 18. Workaround für C# CodeDom verursachen Stapelüberlauf (CS1647) in csc.exe?
- 19. Entladen CodeDom-kompilierte Assembly
- 20. Lambda-Ausdruck (MSVC++ ++ vs g)
- 21. Dynamische Schlagwort C# 4.0
- 22. Kombinieren mehrerer Ausdrücke Bäume
- 23. Expression Bäume
- 24. .net2.0 vs .net 4.0 gdi + Unterschied?
- 25. router vs app in express 4.0
- 26. Scala XML.loadString vs Literal Ausdruck
- 27. CodeDOM Mit VB.Net Eigenschaften
- 28. generieren Variablennamen von CodeDOM
- 29. Codedom generischer Typ Constraint
- 30. Objekte, die Bäume darstellen