2009-02-22 40 views
6

本声明中'=>'是什么意思?运算符'=>'在C#中的含义是什么?

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

上述声明与此相同吗?

del = new SomeDelegate(this.SomeAction); 

谢谢。

+0

您应该对您的问题使用更具描述性的标题,例如“'=>'运算符在C#中的含义是什么?”而不是“c#委托问题” – 2009-02-22 03:52:53

+0

谢谢,我会尽量更具描述性。 – Krakerjak 2009-02-22 03:53:41

回答

7

基本上它是指定一个匿名函数,它不需要调用SomeAction的参数。所以是的,它们在功能上是等同的。虽然不相等。使用拉姆达更等同于:

del = new SomeDelegate(this.CallSomeAction); 

其中CallSomeAction被定义为:

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

希望帮助!

4

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

del = this.SomeAction; 

根据什么类型“del”被seclared as。

编辑

使用lambda表达式或匿名方法或只是开始一个普通的方法使您能够映射不具有委托的签名委托方法。

例如,假设您有一个具有签名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()); 
} 

因此,大家可以看到lambda表达式和匿名方法基本上都是做处理委托的方法只是一个较短/直列方式。在你的情况下,你可能不需要额外的方法。这只取决于委托签名是否与您的方法签名相同,对我而言,似乎是这样。

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

的 “=>” 可以改为“去到“(source: Eric Lippert),并简单地将参数从操作中的参数中分离出来。在这种情况下,lambda是过度杀伤力。更好的例子是:

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

(找到的所有项目,其中项目的类型是美孚)

等。在C#2.0,这也可以写成:

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

而且是一个快速表达方式的功能“内联”,同时也提供“关闭”支持 - 即它也可能是:

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

其实,这是非常,很多编译器不正是我们(无论是“委托”和lambda使用)。最大的区别是,lambda可以使用也可以使用表示Expression,例如LINQ。

相关问题