Разработчики Microsoft очень ленивы, поэтому много чего добавляют в C#.NET, делая разработчиков C#.NET ленивыми.

1. Ознакомьтесь с концепцией делегата

Пожалуйста, прочтите предыдущую статью, чтобы вспомнить концепции делегатов здесь: Обратный вызов в C# — Delegate, Action, Predicate, Func

Как упоминалось в предыдущем посте, делегат — это тип данных, указывающий на функцию, поэтому при присвоении значения делегату мы должны назначить функцию, как в следующем примере:

public delegate void GiveGiftDelegate(string gift);
 
public void GiveGift (string gift) {
 Console.Write (“Gave” + gift);
}
 
//When using:
GiveGiftDelegate dlg = GiveGift;
// Pass the function in, not execute the function so there is no sign ()

2. Анонимная функция

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

// Use anonmyous function, GiveGiftDlg is now a delegate
var GiveGiftDlg = function(gift) {alert ("gift"); };
 
function isHome(vo, GiveGift) {
    var gift = "Gift received";
    GiveGift(gift);
}
 
// Use in code
isHome (vo, GiveGiftDlg);

К счастью, в C# мы также можем написать анонимную функцию следующим образом (из .NET 2.0):

public delegate void GiveGiftDelegate(string gift);
 
GiveGiftDelegate dlg =
          delegate(string gift){ Console.WriteLine("Give " + gift); };

Мы считаем, что запись делегата таким образом довольно громоздка, верно? Microsoft увидела то же самое и добавила лямбда-выражения и .NET 3.0. Хотите узнать, что такое лямбда-выражение, смотрите ниже.

3. Лямбда-выражение

Хочу повторить энную вещь: «Старые разработчики Microsoft очень ленивы, поэтому много чего добавляют в C#.NET, делают разработчиков C#.NET ленивыми». Мы можем понять, что лямбда-выражение — это более краткий способ написать анонимную функцию:

// Old way
GiveGiftDelegate dlg = delegate (string gift) {Console.WriteLine ("Give " + qua); };
 
// Use a lambda expression
GiveGiftDelegate lamdaDlg = (gift) => {Console.WriteLine ("Gift:" + gift); }
 
// The complete statement of lambda expression.
// The "=>" sign is called go-to
(parameters) => {statement}

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

//1. It is possible to ignore the data type of the passed parameter
(string gift) => {Console.WriteLine ("Give gift:" + gift);}
(gift) => {Console.WriteLine ("Gift:" + gift);}
 
//2. If there are no parameters, leave the () blank
() => {Console.WriteLine ("Hello");}
 
// 3. If there is only 1 parameter, you can remove the () sign.
(x) => {Console.WriteLine ("Hello" + x);}
x => {Console.WriteLine ("Hello" + x);}
 
// 4. If there are many parameters, separate them with commas
(x, y) => {Console.WriteLine ("Hello" + x + y);}
 
// 5. If the anonymous function has only 1 statement, you can remove the {}
x => {Console.WriteLine ("Hello" + x); }
x => Console.WriteLine ("Hello" + x)
 
// 6. If only return 1 value, you can omit the word return.
// The following 4 lambda expressions are equivalent
(x) => {return x> 4; }
x => {return x> 4; }
x => return x> 4
x => x> 4

В этот момент некоторые из вас удивятся: «Вау, так оно и есть». Вот как мы применяем описанные выше шаги, чтобы уменьшить лямбда-выражение.

4. Лямбда-выражение и LINQ

Вы когда-нибудь видели, какой параметр передается функции LINQ, такой как Where First?. Да, это делегат функции, возвращающей bool (Подробнее о Func в предыдущем посте).

Поэтому мы используем лямбда-выражение для передачи анонимной функции в функцию Where или First. Например, когда вы используете функцию LINQ Where для поиска элементов в массиве:

var studentList = new List <Student> ();
 
// This neat little thing is a lambda expression
var students = studentList.Where (stu => stu.Age> 20);
 
// If we don't have it, we have to write something that is both wordy and disgusting as follows
var student = studentList.Where (new delegate (Student stu) {return stu.Age> 20;});
 
// Or worse
public bool FindStudentWithAge (Student stu) {return stu.Age> 20; }
var student = studentList.Where (FindStudentWithAge);

Поздравляю с изучением еще одной интересной вещи, которую мало кто знает в C#.NET. Лямбда-выражения и анонимные функции — это особые проблемы в .NET; вас могут спросить, хотите ли вы подать заявку на должность старшего разработчика.

Статья заканчивается здесь.