Что означает оператор '=>' в C #? - PullRequest
6 голосов
/ 22 февраля 2009

Что означает «=>» в этом утверждении?

del = new SomeDelegate(() => SomeAction());

Является ли вышеуказанная декларация такой же, как эта?

del = new SomeDelegate(this.SomeAction);

Спасибо.

Ответы [ 4 ]

7 голосов
/ 22 февраля 2009

По сути, это указание анонимной функции, которая не принимает параметров, вызывающих SomeAction. Так что да, они функционально эквивалентны. Хотя не равны. Использование лямбды более эквивалентно:

del = new SomeDelegate(this.CallSomeAction);

, где CallSomeAction определяется как:

public void CallSomeAction()
{
    this.SomeAction();
}

Надеюсь, это поможет!

4 голосов
/ 22 февраля 2009

«=>» может быть прочитано «идет к» ( источник: Эрик Липперт ) и просто отделяет аргумент (ы) от операции в лямбда-выражении. В этом случае лямбда является излишним. Лучшими примерами будут:

var subList = list.FindAll(item => item.Type == "Foo");

(найти все предметы, у которых тип предмета Foo)

и т.д.. В C # 2.0 это также может быть написано:

var subList = list.FindAll(delegate(SomeType item) {
   return item.Type == "Foo";});

И это быстрый способ выражения функции «inline», в то же время предлагая поддержку «замыкания» - то есть это также может быть:

string itemType = ...
var subList = list.FindAll(item => item.Type == itemType);

Чтобы сделать это иначе, потребуется определение типа для передачи типа элемента:

class Searcher {
    public string itemType;
    public bool Find(SomeType item) {return item.Type == itemType;}
}
...
Searcher searcher = new Searcher();
searcher.itemType = ...
var subList = list.FindAll(searcher.Find);

На самом деле, это почти то же самое, что делает для нас компилятор (как для «делегата», так и для лямбда-выражения). Самая большая разница в том, что лямбда может также выражать Expression, например, для LINQ.

4 голосов
/ 22 февраля 2009

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

del = this.SomeAction;

В зависимости от того, какой тип "del" обозначается как.

Редактировать

Использование лямбда-выражения или анонимных методов или просто обычного метода для начинающих позволяет отображать методы, которые не имеют подписи делегата, для делегата.

Например, скажем, у вас есть делегат с подписью bool myDelegate (int, int), но вы хотите иметь метод с подписью bool myMethod (string, string) для обработки делегата. Затем вы можете использовать лямбда-выражение, чтобы позволить вам сделать это встроенным с коротким синтаксисом, подобным этому.

delegate bool myDelegate(int x, int y);

// With lambdas... 
myDelegate del = (int a, int b) => myMethod(a.ToString(), b.ToString());

// With anonymous methods...
myDelegate del2 = delegate(int a, int b) { return myMethod(a.ToString(), b.ToString()); };

// The good ol' way without lambdas or anonymous methods...
myDelegate del3 = SomeDelegateHandler;

... then write a method somewhere else ...

// Handler method
private bool SomeDelegateHandler(int a, int b)
{
  return myMethod(a.ToString(), b.ToString());
}

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

2 голосов
/ 22 февраля 2009

=> - это Лямбда-оператор , лямбда-выражения похожи на эволюцию анонимных методов C # 2.0 .

Вы можете использовать анонимные методы и лямбда-выражения очень похожим образом для создания экземпляров делегатов:

Func<string,int> wordCount;
wordCount = delegate (string text) { return text.Split().Length; };
Console.WriteLine (wordCount("Hello World"));

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

Func<string,int> wordCount;
wordCount = (string text) => { text.Split().Length; };
Console.WriteLine (wordCount("Hello World"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...