2012-02-27 2 views
0

Когда вы строите дерево выражений во время выполнения, отсутствует код . Это способ представления .NET кода во время выполнения ...Дерево выражений испускает код времени выполнения?

Ok ...

Теперь давайте говорить у меня есть этот код:

ParameterExpression p = Expression.Parameter (typeof (string), "s"); 
    MemberExpression stringLength = Expression.Property (p, "Length"); 
    ConstantExpression five = Expression.Constant (5); 
    BinaryExpression comparison = Expression.LessThan (stringLength, five); 
    Expression<Func<string, bool>> lambda= Expression.Lambda<Func<string, bool>> (comparison, p); 

    Func<string, bool> runnable = lambda.Compile(); 

Этот код Привычка быть в IL? Конечно, это будет ! (возможно, последняя строка не испустит код до компиляции ... но первые строки, которые, я думаю, испустят код!)

Так что же я здесь сохраняю?

Хорошо, поэтому первые 5 строк испустили код, а последний не сделал ... большое дело.

Что мне не хватает? Не могли бы вы позволить мне увидеть всю картину?

+0

Когда вы вызываете компиляцию, дерево выражений преобразуется в IL (используя 'DynamicMethod'). – leppie

+0

@leppie и первые 5 строк не будут в IL? –

+0

Ну, это обычный код, который сначала компилируется. Выражение не имеет понятия IL, это абстракция, которая может быть испущена IL, но нет необходимости делать это (вы можете, например, исправить свой собственный x86 ASM или код графического процессора и т. Д.). – leppie

ответ

1

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

Дерево выражений, которое вы покажете, будет скомпилировано: s.Length < 5 и вы будете вызывать runnable с bool isStringSmallerThan5 = runnable("MyString").

Вся идея деревьев выражений состоит в том, что они описывают некоторый код и могут быть скомпилированы во время выполнения. Это означает, что вы можете сделать следующее:

BinaryExpression comparison = null; 
if (lessThen) 
{ 
    comparison = Expression.LessThan(stringLength, five); 
} 
else 
{ 
    comparison = Expression.GreaterThan(stringLength, five); 
} 

Теперь вы можете изменить поведение своего кода во время выполнения!

Наибольшее использование деревьев выражений состоит в том, что они могут быть интерпретированы поставщиком. Например, Linq To Entities использует деревья выражений и компилирует их в код SQL, который может быть запущен в отношении базы данных. LinqToXml - еще один пример того, что вы можете сделать с деревьями выражений.

Это хороший blog post, чтобы вы начали.

+0

Я вижу, что HOw Im gonna do 9000 If's in my code Если я хочу, чтобы он действовал динамически .... –

+0

Чего вы хотите достичь? Выражение Деревья в основном используются в таких вещах, как Linq. Создание реального динамического кода не является основным сценарием. И если у вас есть «9000» разных сценариев, как вы хотите их поддерживать? –

+0

Вижу ... Не могли бы вы дать небольшой пример того, как linq использует это в самом простом запросе? –

0

Деревья выражений полезны, когда вы получаете их в методе, поскольку они позволяют вам более усложнять использование содержимого выражения. Если вы получите предикат в методе, вы можете запустить его против цели и проверить результат. Если вы получите дерево выражений, представляющее дерево выражений, вы можете проанализировать его и сделать с ним что-то полезное. Примером является LINQ, который использует это много мест, но среди одного в методах «Where». Ловля дерева выражений, а не IL делает его относительно прямым для перевода в SQL, а не просто полного «Select» и запускает предикаты против материализованного результата.

+0

спасибо, но я задал свой вопрос как точку зрения «Code emitting» ... что я здесь сохраняю? и если я получаю вместо предиката - дерево выражений - мне все равно придется «скомпилировать» его ... так что я заработал? Я не могу понять суть (и я знаю, что есть один :)). –

+0

ИМХО, дело в том, что у вас есть более «дружественное» промежуточное представление. Но вам определенно придется скомпилировать его в какой-то момент. Давайте посмотрим, есть ли у кого-то умнее меня лучшее объяснение :) – faester

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