140 likes | 307 Views
Сообщество студентов IT- разработчиков СевНТУ. ExpressionTree и лямбда выражения в языке С #. Смирнов Сергей, sayrus89@gmail.com 2010. Анонимные функции.
E N D
Сообщество студентов IT-разработчиков СевНТУ ExpressionTree и лямбда выражения в языке С# Смирнов Сергей,sayrus89@gmail.com 2010
Анонимные функции Именованные методы были единственным способом объявления делегата в версиях 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); });
Expression Trees Деревья выражений представляют языковый код в виде данных. Данные хранятся в древовидной структуре. Каждый узел в дереве выражений представляет выражение, например вызов метода или двоичную операцию, такую как x < y.
Пример выражения и его представление в виде дерева выражений
Expression Trees и лямбда-выражения Когда лямбда-выражение назначается переменной с типом Expression<TDelegate>, компилятор отражает дерево выражений, представляющее лямбда-выражение. Тип Expression<TDelegate> предоставляет метод Compile, который компилирует код, представляемый деревом выражений, в исполняемый делегат. Этот исполняемый код эквивалентен исполняемому коду, который бы генерировался, если бы лямбда-выражение было назначено типу делегата первоначально.
Построение Expressions Expressions можно построить двумя методами — в compile-time, и в run-time. В сompile-time компилятор сам разберет наш код и соберет из него Expression. Например, для вот такой строчки: Expression<Func<string, int>> ex = s => s.Replace("x", "yy").Length*2;
Изменение Expression Возьмем выражение (n+1) и превратим его в 2*(n+1):
Пример применения Если выражение LINQ представлено в данных (как дерево выражений), а не в IL (как делегат), то вы можете оперировать с ним. Есть возможность применить алгоритм, который может выявлять места, где следует провести оптимизацию, тем самым упрощая выражение.