1 / 13

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

Сообщество студентов IT- разработчиков СевНТУ. ExpressionTree и лямбда выражения в языке С #. Смирнов Сергей, sayrus89@gmail.com 2010. Анонимные функции.

perry-mejia
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Сообщество студентов IT-разработчиков СевНТУ ExpressionTree и лямбда выражения в языке С# Смирнов Сергей,sayrus89@gmail.com 2010

  2. Анонимные функции Именованные методы были единственным способом объявления делегата в версиях C#, предшествующих версии 2.0. Анонимные методы были представлены в C# 2.0

  3. Использование анонимных методов позволяет сократить издержки на кодирование при создании делегатов, поскольку не требуется создавать отдельный метод.

  4. Лямбда-выражения В C# 3.0 и более версиях поздних лямбда-выражения заменяют анонимные методы и являются предпочтительным способом написания встроенного кода.

  5. Анонимные методы прекрасно справляются с поставленной перед ними задачей. Но в C# 3.0 пошли дальше, введя более привычную для математиков форму записи анонимного метода в виде лямбда-выражения. Вместо записи анонимного метода в форме: delegate [(<сигнатура метода>)] <тело метода> используется форма, задающая лямбда-выражение: [(<сигнатура метода>)] => <тело метода>

  6. В методеанонимный метод определяется следующим образом: 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); });

  7. Expression Trees Деревья выражений представляют языковый код в виде данных. Данные хранятся в древовидной структуре. Каждый узел в дереве выражений представляет выражение, например вызов метода или двоичную операцию, такую как x < y.

  8. Пример выражения и его представление в виде дерева выражений

  9. Expression Trees и лямбда-выражения Когда лямбда-выражение назначается переменной с типом Expression<TDelegate>, компилятор отражает дерево выражений, представляющее лямбда-выражение. Тип Expression<TDelegate> предоставляет метод Compile, который компилирует код, представляемый деревом выражений, в исполняемый делегат. Этот исполняемый код эквивалентен исполняемому коду, который бы генерировался, если бы лямбда-выражение было назначено типу делегата первоначально.

  10. Построение Expressions Expressions можно построить двумя методами — в compile-time, и в run-time. В сompile-time компилятор сам разберет наш код и соберет из него Expression. Например, для вот такой строчки: Expression<Func<string, int>> ex = s => s.Replace("x", "yy").Length*2;

  11. Изменение Expression Возьмем выражение (n+1) и превратим его в 2*(n+1):

  12. Пример применения Если выражение LINQ представлено в данных (как дерево выражений), а не в IL (как делегат), то вы можете оперировать с ним. Есть возможность применить алгоритм, который может выявлять места, где следует провести оптимизацию, тем самым упрощая выражение.

  13. Демонстрация

More Related