Объясните x => x.ToString() // упрощаем множество вызовов

StackOverflow https://stackoverflow.com/questions/156815

  •  03-07-2019
  •  | 
  •  

Вопрос

В вопрос ответ Я нахожу следующий совет по кодированию: -

2) простые лямбды с одним параметром:

x => x.ToString() //simplify so many calls

Как человек, который еще не использовал версию 3.0, я не совсем понимаю этот совет, но он выглядит интересно, поэтому я был бы признателен за объяснение того, как это упрощает вызовы, с помощью нескольких примеров.

Я исследовал лямбды, поэтому я думать Я знаю, что они делают, но я может не до конца понимаю, так что маленький распаковка также может быть в порядке.

Это было полезно?

Решение

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

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");

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

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });

В C# 1.0 вам пришлось бы создать целый дополнительный метод.Кроме того, если вы хотите параметризовать его, вам придется создать другой тип, тогда как анонимные методы и лямбда-выражения фиксируют среду выполнения (локальные переменные и т. д.), поэтому они действуют как замыкания:

public Person FindByName(List<Person> list, String name)
{
    return list.Find(p => p.Name == name); // The "name" variable is captured
}

Подробнее об этом есть в моя статья о замыканиях.

Хотя передача делегатов в методы не очень распространена в C# 2.0 и .NET 2.0, она составляет значительную часть основы LINQ, поэтому вы склонны часто использовать ее в C# 3.0 с .NET 3.5.

Другие советы

В основном это распространяется на:

private string Lambda(object x) {
  return x.ToString();
}

Знакомы ли вы с анонимными методами C# 2.0?Эти два вызова эквивалентны (при условии, что SomeMethod принимает делегат и т. д.):

SomeMethod(x => x.ToString());

SomeMethod(delegate (SomeType x) { return x.ToString();});

Я знаю, что я предпочитаю напечатать...

string delegate(TypeOfX x)
{
  return x.ToString();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top