Pull to refresh

Лямбды

Reading time 2 min
Views 3.2K
Некоторое время назад я узнал о лямбдах, но не совсем понимал принципов построения выражений с лямбдой. Но сегодня наткнулся на пост Charlie Calvert'а и всё для себя прояснил.

Рассмотрим пример:
Func<int, int, int> myLambda = (a, b) => (a + b);

* This source code was highlighted with Source Code Highlighter.

Данная запись эквивалентна следующему блоку кода:
public static int Add(int a, int b)
{
  return a + b;
}

Func<int, int, int> myDelegate = Add;


* This source code was highlighted with Source Code Highlighter.

Можно заметить, что левые части выражения идентичны:
Func<int, int, int> myLambda = (a, b) => (a + b);
Func<int, int, int> myDelegate = Add;

* This source code was highlighted with Source Code Highlighter.

Ну а теперь, если внимательно взглянуть на правые части, то можно заметить одну особенность.
Сравним правые части выражений: (a, b) и Add. В скобках у нас указаны аргументы метода Add, а (a + b) является телом метода Add.
То есть, если просто, то, что идет в правой части до лямбды "=>" — это аргументы метода, а то, что после лямбды — тело метода.

Также можно представить метод без аргументов:
public static void UseLocal()
{
  int n;
  Func<int> func = () => { n = 6; return n; };
  n = func();
  Console.WriteLine(n); // Outputs the number 6
}

* This source code was highlighted with Source Code Highlighter.


Ну и для тех, кто, может быть, не знает, как все это произносится: (a, b) => a + b читается «a и b переходят в a плюс b».

После этого просветления мне стало всё понятно, и, надеюсь, больше я подсматривать в примеры при создании лямбда выражений не буду :)

А вот и сам источник: blogs.msdn.com/charlie/archive/2008/06/28/lambdas.aspx

UPD: здесь можно прочитать про замыкания, и проблемы, возникающие при этом
Tags:
Hubs:
+17
Comments 9
Comments Comments 9

Articles