2009-10-12 3 views
4

Могу ли я следовать любой простой синаксии или правилам для создания «лямбда-выражения» в C#? Я прочитал несколько статей и понял, что такое лямбда-выражение, но если у меня есть общий синтаксис или правила, которые были бы полезны.Яркое выражение выражения синтаксиса

ответ

8

Выражение лямбда, в основном, сокращенное обозначение для указателя функции. Чаще всего, лямбда-выражение представляет собой распространение входных данных в выражение, которое вычисляет результат. В большинстве случаев вы будете использовать лямбда-выражения в их более общей форме:

int[] numbers = new[] { 1, 3, 11, 21, 9, 23, 7, 4, 18, 7, 7, 3, 21 }; 

var twentyoneCount = numbers.Where(n => n == 21).Count(); 
var sumOfgreaterThanSeven = numbers.Sum(n => n > 7 ? n : 0); 

В их менее общей форме, лямбда-выражение может заменить более громоздкие делегата формы:

myButton.Click += new EventHandler(myButton_Click); 
// ... 
void myButton_Click(object sender, EventArgs e) 
{ 
    // TODO: Implement button click handler here 
} 

Или менее распространенные, и менее многословным:

myButton.Click += delegate(object sender, EventArgs e) 
{ 
    // TODO: Implement button click handler here 
}; 

следующее выражение лямбда достигает того же результата, что и выше двух:

myButton.Click += (s,e) => 
{ 
    // TODO: Implement button click handler here 
}; 

Сила этой последней формы действительно связана с ее способностью создавать замыкания. Затвор где вы реализуете функцию внутри функции, и «закрыть» вокруг параметров и переменных из родительской области видимости функции:

private void DoSomething(IList<string> input, SomeObject source) 
{ 
    source.OnSomeEvent += (s,e) => return input.Sum(); 
} 
+0

Отлично. Это точно взяло меня в реальный мир программирования. Thousand спасибо jrista – user184805

+0

«Лямбда-выражение, в основном, сокращенное обозначение для указателя функции». Не обязательно. Важным отличием и важной особенностью лямбда является способность рассматривать их как данные (деревья выражений), а не код (анонимные методы). Http: // StackOverflow.com/questions/793571/why-would-you-use-expressionfunct-rather-than-funct/793584 # 793584 –

+0

@Mehrdad: Правда, lambdas действительно становятся деревьями выражений. Однако конечный результат вычисления дерева выражений оценивает динамический метод, на который указывает делегат. Дерево выражений - это просто промежуточное представление конечного указателя функции. Обратите внимание на метод .Compile(), который возвращает делегат: http://msdn.microsoft.com/en-us/library/bb345362.aspx – jrista

10

Есть несколько способов выражения лямбды, в зависимости от конкретного сценария - некоторые примеров:

// simplest form; no types, no brackets 
    Func<int, int> f1 = x => 2 * x; 
    // optional exlicit argument brackets 
    Func<int, int> f2 = (x) => 2 * x; 
    // optional type specification when used with brackets 
    Func<int, int> f3 = (int x) => 2 * x; 
    // multiple arguments require brackets (types optional) 
    Func<int, int, int> f4 = (x, y) => x * y; 
    // multiple argument with explicit types 
    Func<int, int, int> f5 = (int x, int y) => x * y; 

подпись лямбда должна соответствовать сигнатуре делегата, используемого (будь то явно, как выше, или вытекает из контекста в вещах, как .Select(cust => cust.Name)

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

// no arguments 
    Func<int> f0 =() => 12; 

В идеале, выражение в правой части является точно, что; одно выражение. Компилятор может преобразовать это либоdelegateилиExpression дерево:

// expression tree 
    Expression<Func<int, int, int>> f6 = (x, y) => x * y; 

Однако; Вы можете также использовать операторные блоки, но это только тогда использовать в качестве delegate:

// braces for a statement body 
    Func<int, int, int> f7 = (x, y) => { 
     int z = x * y; 
     Console.WriteLine(z); 
     return z; 
    }; 

Обратите внимание, что даже при том, что .NET 4.0 Expression деревья поддержки выписки тела, C# 4.0 компилятор не сделать это для вы, поэтому вы по-прежнему ограничены простыми деревьями Expression, если вы не сделаете это «трудным путем»; см. my article on InfoQ для получения дополнительной информации.

Смежные вопросы