Именованные методыИменованные методы были единственным способом объявления делегата в версиях 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, компилятор отражает дерево выражений, представляющее лямбда-выражение.Expression Тип Expression предоставляет метод Compile, который компилирует код, представляемый деревом выражений, в исполняемый делегат. Этот исполняемый код эквивалентен исполняемому коду, который бы генерировался, если бы лямбда-выражение было назначено типу делегата первоначально.Expression Compile
Expressions можно построить двумя методами в compile-time, и в run-time. В сompile-time компилятор сам разберет наш код и соберет из него Expression. Например, для вот такой строчки: Expression > ex = s => s.Replace("x", "yy").Length*2;
Возьмем выражение (n+1) и превратим его в 2*(n+1):
Если выражение LINQ представлено в данных (как дерево выражений), а не в IL (как делегат), то вы можете оперировать с ним. Есть возможность применить алгоритм, который может выявлять места, где следует провести оптимизацию, тем самым упрощая выражение.