运算符’=>’在C#中意味着什么?

这句话中的’=>表示什么?

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

以上声明是否与此相同?

 del = new SomeDelegate(this.SomeAction); 

谢谢。

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

 del = new SomeDelegate(this.CallSomeAction); 

其中CallSomeAction定义为:

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

希望有所帮助!

“=>”可以读作“转到”( 来源: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";}); 

并且是表达“内联”function的快速方式,同时还提供“闭包”支持 – 即它也可以是:

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

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

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

 del = this.SomeAction; 

取决于“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和匿名方法基本上只是制作处理委托的方法的更短/内联方式。 在您的情况下,您可能不需要制作额外的方法。 它只取决于委托签名是否与您的方法签名相同,对我来说,它似乎就是这样。

=>是Lambda运算符 ,lambda表达式就像是C#2.0 匿名方法的演变。

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

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

使用lambda表达式:

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