C # 4.0: деревья выражений против CodeDom - PullRequest
9 голосов
/ 17 июля 2010

В чем различия между деревьями выражений и CodeDom?Что я должен использовать для какого сценария?

Ответы [ 2 ]

25 голосов
/ 18 июля 2010

Деревья выражений имеют много общего с (например) AST .Он не отображается непосредственно на код, но очень поддается построению из алгоритмов.Например, если вы анализируете формулу:

((a + 2) / b)

, то есть:

ParameterExpression a = ..., b = ...
var body = Expression.Divide(
    Expression.Add(a, Expression.Constant(2)),
    b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics

На самом деле, я сделал точно , используя парсер, которыйпостроить дерево объектов, с объектами, генерирующими полное выражение через реализацию "посетителя".В .NET 4.0 расширенная поддержка дерева выражений позволяет поддерживать большинство сценариев и компилировать их по требованию.

Другое ключевое использование выражений заключается в том, что вы можете деконструировать их во время выполнения, поэтому в вашем коде вы можете иметь:

Foo(x => x.SomeMethod(1, "abc"));

и извлечь SomeMethod method-info, 1 и "abc" и т. д.


*Код 1025 * отображается на код .Это все об операторах и т. Д., очень похоже на то, как вы пишете обычный код.Наиболее распространенное использование кодирования для генерации кода, как часть инструментов.Вы можете использовать его для динамической компиляции, но, честно говоря, это сложнее.Я не фанат.Приятной особенностью является то, что кодовое дерево может работать для нескольких языков.

Другой претендент здесь должен быть DynamicMethod и / или ILGenerator.Это не сопоставляется с AST (выражением) и не может использоваться для генерации исходного кода (кодирования), но обеспечивает полный доступ к инструментам MSIL.Конечно, это также требует, чтобы вы думали с точки зрения стеков и т. Д., Но это очень эффективно и эффективно для метапрограммирования.


Если ILGenerator слишком сложноядро и кодирование - это PITA, затем другой вариант - генерация кода во время выполнения в виде строки .Затем передайте это через CSharpCodeProvider, чтобы скомпилировать.Есть части ядра времени выполнения, которые делают это (XmlSerializer IIRC).


Итак, подведем итог:

  • метапрограммирование: ILGenerator или CSharpCodeProvider;также Expression в 4.0 (но это довольно ограничено в 3.5)
  • обработка AST: Expression
  • синтаксический анализ во время выполнения: Expression
  • генерация кода внесколько языков: код-дом
0 голосов
/ 17 июля 2010

Деревья выражений используются для построения выражений. Создание исходного кода во время выполнения. CodeDom используется для компиляции исходного кода. Он должен существовать, прежде чем вы сможете его построить. Деревья выражений более гибкие, но намного сложнее в использовании.

Если вы хотите добавить скрипты в свое приложение, используйте CodeDom. Если вы хотите делать очень сложные размышления и тому подобное, используйте деревья выражений, но я не рекомендую это.

...