Что означает синтаксис '=>' в C #? - PullRequest
69 голосов
/ 14 ноября 2008

Я только что подошел к этому синтаксису в некоторых вопросах этого форума, но Google и любой другой поисковик имеют тенденцию блокировать в поиске что угодно, кроме букв и цифр, поэтому поиск "=>" невозможен.

Так может кто-нибудь сказать мне, что это такое и как оно используется?

Ответы [ 8 ]

77 голосов
/ 14 ноября 2008

Это лямбда-оператор.

От C # 3 до C # 5 это использовалось только для лямбда-выражений . Это в основном более короткая форма анонимных методов , представленных в C # 2, но также может быть преобразована в деревья выражений .

Как пример:

Func<Person, string> nameProjection = p => p.Name;

эквивалентно:

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

В обоих случаях вы создаете делегата с параметром Person, возвращая имя этого человека (в виде строки).

В C # 6 такой же синтаксис используется для членов с выражением тела , например,

// Expression-bodied property
public int IsValid => name != null && id != -1;

// Expression-bodied method
public int GetHashCode() => id.GetHashCode();

Смотри также:

(И действительно, много похожих вопросов - попробуйте теги лямбда и лямбда-выражения .)

15 голосов
/ 14 ноября 2008

Это означает удивительность. Например,

x => x + 1

представляет метод, который принимает x в качестве параметра и возвращает его преемника.

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));

назначает обработчик события кнопке, вызывая метод, который содержит MethodInfo.

11 голосов
/ 10 июля 2012

Это еще одна форма обозначения функции. Следующее примерно эквивалентно:

// explicit function
int MyFunc(int pParam)
{
   return pParam;
}

// delegate function
Func<int, int> MyFunc = delegate(int pParam) { return pParam; };

// lambda expression
Func<int, int> MyFunc = x => x;

Думайте о лямбда-выражении как о «давай что-нибудь, возвращай что-нибудь». В приведенном выше примере функция x => x говорит: «задано х, вернуть х». (Хотя лямбда-выражения не обязательно должны возвращать что-то, в этом случае вы можете прочитать их как «данные x, сделайте что-нибудь с x».)

9 голосов
/ 14 ноября 2008

вот простой пример из MSDN

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

Все, что перед =>, является входными параметрами, а что-либо после является выражением. Вы можете иметь несколько входных параметров. Лямбды в основном используются с Linq.

6 голосов
/ 14 ноября 2008

Вместо использования анонимного метода, подобного этому:

somevar.Find(delegate(int n)
{
   if(n < 10)
      return n;
});

Вы просто пишете это так:

somevar.Find(n => n < 10);

Принимает тип данных на основе возвращаемого значения.

0 голосов
/ 13 февраля 2019

Маркер => поддерживается в двух формах: как лямбда-оператор и как разделитель имени члена и реализации члена в выражении определение тела.

Лямбда-оператор

В лямбда-выражениях лямбда-оператор => отделяет входные переменные с левой стороны от тела лямбда-выражения с правой стороны.

В следующем примере функция LINQ с синтаксисом метода используется для демонстрации использования лямбда-выражений:

string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

Определение тела выражения

Определение тела выражения имеет следующий общий синтаксис:

member => expression;

где выражение является допустимым выражением. Обратите внимание, что выражение может быть выражением оператора только в том случае, если возвращаемый тип члена имеет тип void или член является конструктором, финализатором или средством доступа к набору свойств.

В следующем примере показано определение тела выражения для метода Person.ToString:

public override string ToString() => $"{fname} {lname}".Trim();

Это сокращенная версия следующего определения метода:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}
0 голосов
/ 14 ноября 2008

Это часть синтаксиса лямбда-выражения. Лямбда-выражение по сути является сокращенной формой делегата или анонимного метода. Для иллюстрации предположим, что у меня есть массив строк, соответствующих буквам алфавита. Я мог бы выбрать элементы этого массива, которые содержали значения больше «E», с помощью следующего выражения LINQ:

var someLetters = алфавит. Где (l => l> "E");

Часть лямбда-выражения слева от «=>» идентифицирует имя переменной для теста (которая задана для отдельных элементов алфавита) и часть лямбда-выражения справа от «= > "идентифицирует обработку. В этом случае обработка выдает логическое значение, которое логика Where использует для определения, передается ли каждый элемент алфавита в массив someLetters.

0 голосов
/ 14 ноября 2008

Это в основном означает "входит в", как параметр

MyObjectReference => MyObjectReference.DoSomething()

Обычно вы используете их для передачи функций в методы в качестве параметров или в операторах LINQ

MyCollection.Where(myobj => myobj.Age>10)

Например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...