重复: 委托关键字与lambda表示法
我理解匿名方法可用于定义委托和编写内联函数.使用Lambda表达式与此有何不同?
我想我什么时候使用什么有点困惑.
编辑:另外,似乎要使用匿名或lambdas,需要一个类型的扩展方法?
Ada*_*der 15
lambda表达式只是匿名方法的快捷语法.匿名方法如下所示:
delegate(params) {method body}
Run Code Online (Sandbox Code Playgroud)
等效的lambda表达式如下所示:
params => method body
Run Code Online (Sandbox Code Playgroud)
简而言之,所有lambda表达式都是匿名方法,但是有可能有一个不是用lambda语法编写的匿名方法(就像上面的第一个例子).希望这有用!
只有没有方法体的lambda表达式才能转换为表达式树
下面的结构做编译:
Func<int> exp1 = () => 1;
Func<int> exp2 = () => { return 1; };
Func<int> exp3 = delegate { return 1; };
Expression<Func<int>> exp4 = () => 1;
Run Code Online (Sandbox Code Playgroud)
而继做不
Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 = () => { return 1; }; //or lambdas with block body
Run Code Online (Sandbox Code Playgroud)
所以即使在非常高级的水平上也存在差异(Jon Skeet在这里指出病态差异的例子)
另一个区别是,如果您不打算在方法体内使用它们,则可以创建没有参数列表的匿名委托,使用lambda总是必须提供参数.
以下两行证明了差异
Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;
Run Code Online (Sandbox Code Playgroud)
你基本上做同样的事情,但匿名代表在这里看起来更好.