Дерево выражений испускает код времени выполнения? - PullRequest
0 голосов
/ 27 февраля 2012

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

Хорошо ...

Теперь допустим, у меня есть этот код:

    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();

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

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

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

Что я пропустил?Можете ли вы позволить мне увидеть всю картину?

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

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

Показанное вами дерево выражений будет скомпилировано в: 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 - еще один пример того, что вы можете делать с деревьями выражений.

Это хорошее сообщение в блоге , чтобы вы начали.

0 голосов
/ 27 февраля 2012

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

...