2009-10-19 2 views
6

Я прочитал несколько статей и несколько stackoverflow.com сообщений о дереве выражений. Это избиение моего мозга, чтобы понять.Бит Любопытно понимать Дерево выражений в .NET

Вопросы:

1) Как DOM (Document Object Model), это в памяти представление логики?

2) Кто-то объяснил, что это механизм для перевода исполняемого кода в данные, используя его, мы можем создать структуру данных, представляющую код.

Это означает, что деревья выражений используются для создания пользовательского шаблона?

3) Большинство примеров показывают дерево выражений совместно с делегатом Func<> или другими делегатами. Поэтому, используя делегат и другую конструкцию программирования, мы не можем достичь того же, что и дерево выражений.

Понятное объяснение начинающих очень приветствуется.

+0

BTW. деревья выражений не являются специфическими для C#, поэтому я сменил тему. –

ответ

16

Дерево выражений представляет собой дерево синтаксиса одного выражения.

Каждый узел дерева представляет собой некоторую константу, ссылку на объект или операцию.

E.g.для выражения 2 + 3 мы можем построить и дерево выражения:

Expression.MakeBinary(
    ExpressionType.Add, 
    Expression.Constant(2), 
    Expression.Constant(3)); 

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

Expression<Func<int>> sum =() => 2 + 3; // much nicer, eh? 

Но выражение не делегируют, так как она не может быть выполнена непосредственно.

Вместо этого он может быть пройден, например. с объектом-посетителем для создания некоторого исполняемого представления. Примерами могут быть делегирование сборки с помощью выражения Expression.Compile() или SQL, построенного из запроса LINQ с использованием CompiledQuery.Compile() и т. Д.

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

PropertyInfo prop1 = typeof(MyClass).GetProperty("Value"); 

Expression<Func<MyClass, int>> expr = mc => mc.Value; 
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo; 
+1

+1 действительно хорошее объяснение :-) –

3

Here's an article, который объясняет основы ...

Короче:

1) В принципе, да, что это представление в памяти логики.

2) Он может быть скомпилирован в MSIL (или, как в случае LINQ-to-SQL, также на другие языки).

3) Делегаты Func <> используются, потому что они используются для представления выражения как вызываемой функции (которая внутренне компилируется как MSIL).

+0

в действительности, однако, Func <> (и соответствующие Action <> делегаты) находятся только для удобства. Вы можете использовать любой тип делегата –

+1

OMG! Это учебник, где я понял деревья выражений !! –

1

Я не специалист по этому вопросу, но я попытаюсь прояснить путь.

Подумайте, как деревья выражений, как типизированное отражение. Это простой способ узнать, что такое функция, например, что такое операнд, параметры и прочее.

Итак,
1) Я бы сказал, да.
2) Не совсем ... вы должны сначала изучить эту функцию (я тоже), а затем найти то, для чего это хорошо. Вы генерируете код? что для меня может быть очень полезной особенностью выражений-деревьев
3) Дерево выражений - это новая функция, но вы ничего не могли сделать раньше. Теперь это просто проще.

Существует хорошая статья here, которая объясняет основы.

+0

@ Lucero, я рад, что мы оба разместили одну и ту же ссылку :) – sebagomez

+0

Все любят основы дерева выражений Чарли: D –

10

Expression является универсальным способом выражения операций в качестве кода объектной модели. Это расширено гораздо больше в 4.0, но это область, в которой я использую лот; У меня есть некоторые пункты блога here, или еще одна попытка объяснить все это на InfoQ. Я также представил эту тему несколько раз - возможно, попробуйте загрузить here (но это не будет иметь смысла без слов, извините).

Буду честным; это не простой предмет - но это hugely мощный, когда вы его забираете. Из вышеизложенного я, вероятно, начну с InfoQ.

2

Я постарался ответить на такие вопросы, как ваш, на блоге C# FAQ в следующем блоге: Generating Dynamic Methods with Expression Trees in Visual Studio 2010. Итак, да, это в памяти. Я не понимаю, что вы подразумеваете под «определяемыми пользователем шаблонами», но вы можете использовать его для написания динамического кода. И нет, вы не можете заменить ETs делегатами, потому что вы не можете изменять делегатов во время выполнения. Единственным заместителем может быть MSIL, который гораздо труднее читать и писать.

Смежные вопросы