运营商'=>'是什么在C#中意味着什么?

时间:2009-02-22 03:43:18

标签: c# delegates lambda

'=>'是什么在这个声明中表示?

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

以上声明是否与此相同?

del = new SomeDelegate(this.SomeAction);

感谢。

4 个答案:

答案 0 :(得分:7)

基本上它指定了一个匿名函数,它不带任何调用SomeAction的参数。所以是的,它们在功能上是等价的。虽然不相等。使用lambda更等同于:

del = new SomeDelegate(this.CallSomeAction);

其中CallSomeAction定义为:

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

希望有所帮助!

答案 1 :(得分:4)

他们相同的事情,但“()=> ...”语法是所谓的lambda表达式,因此与匿名函数相同。您可以完全省略委托部分,让编译器为您推断出委托类型。

del = this.SomeAction;

取决于“del”被称为“del”的类型。

修改

使用lambdas或匿名方法或仅使用常规方法启动程序,可以将没有委托签名的方法映射到委托。

例如,假设您有一个带有签名bool myDelegate(int,int)的委托,但是您想要一个带有签名bool myMethod(string,string)的方法来处理委托。然后,您可以使用lambda表达式来使用类似的简短语法内联。

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

因为你可以看到lambdas和匿名方法基本上只是一种更短/内联的方法来制作一个方法来处理委托。在您的情况下,您可能不需要制作额外的方法。它只取决于代理签名是否与您的方法签名相同,对我而言,它似乎就是这样。

答案 2 :(得分:4)

“=>”可以读作“转到”(source: Eric Lippert),并简单地将参数与lambda表达式中的操作分开。在这种情况下,lambda是矫枉过正的。更好的例子是:

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

要执行此操作,否则需要使用类型定义来传递item-type:

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

实际上,这与编译器为我们做的非常相似(包括“委托”和lambda用法)。最大的区别是lambda也可以 表示Expression,例如LINQ。

答案 3 :(得分:2)

=>Lambda Operator,lambda表达式就像是C#2.0 anonymous methods的演变。

您可以使用匿名方法和lambda表达式以非常类似的方式创建委托实例:

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

使用lambda表达式:

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