2009-02-22 5 views
6

Что означает '=>' в этом выражении?Что означает оператор '=>' в C#?

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

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

del = new SomeDelegate(this.SomeAction); 

Спасибо.

+0

Вы должны использовать более подробное название для своего вопроса, например: «Что означает оператор« => »на C#?» а не «вопрос делегата C#» –

+0

Спасибо, я постараюсь быть более наглядным. – Krakerjak

ответ

7

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

del = new SomeDelegate(this.CallSomeAction); 

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

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

Надежда, что помогает!

+0

Значит, '=> означает лямбда? Каким будет преимущество одного над другим? – Krakerjak

+1

Преимущество в первую очередь заключается в лаконичности и удобочитаемости :) – mletterle

4

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

del = this.SomeAction; 

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

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

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

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

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

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

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

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")); 
4

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

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); 

К сделать это в противном случае потребуется тип-Definiton передать в пункте типа:

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.

Смежные вопросы