'=>'是什么在这个声明中表示?
del = new SomeDelegate(() => SomeAction());
以上声明是否与此相同?
del = new SomeDelegate(this.SomeAction);
感谢。
答案 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"));