运算符’=>’在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"));