ExpressionTree и лямбда выражения в языке С

Download Report

Transcript ExpressionTree и лямбда выражения в языке С

Смирнов Сергей, [email protected]
Именованные методы были
единственным способом
объявления делегата в версиях C#,
предшествующих версии 2.0.
Анонимные методы были
представлены в C# 2.0
Использование анонимных методов
позволяет сократить издержки на
кодирование при создании делегатов,
поскольку не требуется создавать
отдельный метод.
В C# 3.0 и более версиях поздних
лямбда-выражения заменяют анонимные
методы и являются предпочтительным
способом написания встроенного кода.
Анонимные методы прекрасно справляются с поставленной
перед ними задачей. Но в C# 3.0 пошли дальше, введя
более привычную для математиков форму записи
анонимного метода в виде лямбда-выражения.
Вместо записи анонимного метода в форме:
delegate [(<сигнатура метода>)] <тело метода>
используется форма, задающая лямбда-выражение:
[(<сигнатура метода>)] => <тело метода>
В методе анонимный метод определяется
следующим образом:
double result =
integral.EvalIntegral(a, b, eps,
delegate(double x) { return Math.Sin(x) + Math.Cos(x); });
Заменим это определение лямбдавыражением:
double result = integral.EvalIntegral(a, b, eps,
x => { return Math.Sin(x) + Math.Cos(x); });
Деревья выражений
представляют языковый код
в виде данных. Данные
хранятся в древовидной
структуре. Каждый узел в
дереве выражений
представляет выражение,
например вызов метода или
двоичную операцию, такую
как x < y.
Когда лямбда-выражение назначается переменной с
типом Expression<TDelegate>, компилятор отражает дерево
выражений, представляющее лямбда-выражение.
Тип Expression<TDelegate> предоставляет метод Compile,
который компилирует код, представляемый деревом
выражений, в исполняемый делегат. Этот исполняемый код
эквивалентен исполняемому коду, который бы
генерировался, если бы лямбда-выражение было назначено
типу делегата первоначально.
Expressions можно построить двумя методами — в
compile-time, и в run-time. В сompile-time компилятор сам
разберет наш код и соберет из него Expression.
Например, для вот такой строчки:
Expression<Func<string, int>> ex =
s => s.Replace("x", "yy").Length*2;
Возьмем выражение (n+1) и превратим его в
2*(n+1):
Если выражение LINQ представлено в данных
(как дерево выражений), а не в IL (как делегат),
то вы можете оперировать с ним.
Есть возможность применить алгоритм, который
может выявлять места, где следует провести
оптимизацию, тем самым упрощая выражение.