Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lambda表达式和匿名方法之间的差异-C#_C#_.net - Fatal编程技术网

lambda表达式和匿名方法之间的差异-C#

lambda表达式和匿名方法之间的差异-C#,c#,.net,C#,.net,重复: 我知道匿名方法可以用来定义委托和编写内联函数。使用Lambda表达式与此有什么不同吗 我想我对什么时候用什么有点困惑 编辑: 此外,似乎要使用匿名或lambdas,类型需要有一个扩展方法?不完全是。它们本质上是完全相同的功能,具有不同的语法结构。不过,对于匿名表达式和函数,一般的转变似乎是从C#2.0匿名方法语法转向lambda风格的语法 lambda表达式只是匿名方法的快捷语法。匿名方法如下所示: delegate(params) {method body} params =>

重复:

我知道匿名方法可以用来定义委托和编写内联函数。使用Lambda表达式与此有什么不同吗

我想我对什么时候用什么有点困惑

编辑:
此外,似乎要使用匿名或lambdas,类型需要有一个扩展方法?

不完全是。它们本质上是完全相同的功能,具有不同的语法结构。不过,对于匿名表达式和函数,一般的转变似乎是从C#2.0匿名方法语法转向lambda风格的语法

lambda表达式只是匿名方法的快捷语法。匿名方法如下所示:

delegate(params) {method body}
params => method body
等效的lambda表达式如下所示:

delegate(params) {method body}
params => method body

简而言之,所有lambda表达式都是匿名方法,但也可以有一个不使用lambda语法编写的匿名方法(如上面的第一个示例)。希望这是有帮助的

Lambda表达式可以转换为表达式树,而匿名委托不能。只有不带方法体的Lambda表达式才能转换为表达式树

以下构造do编译:

            Func<int> exp1 = () => 1;
            Func<int> exp2 = () => { return 1; };
            Func<int> exp3 = delegate { return 1; };
            Expression<Func<int>> exp4 = () => 1;
Func exp1=()=>1;
Func exp2=()=>{return 1;};
Func exp3=委托{return 1;};
表达式exp4=()=>1;
和以下do

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 = () => { return 1; }; //or lambdas with block body
表达式exp5=委托{return 1;}//没有匿名代表
表达式exp6=()=>{return 1;}//或带块体的lambdas
因此,即使在不太高的水平上也存在差异(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;
Func anonymous=delegate{return 1;};
Func lambda=(参数1、参数2、参数3、参数4)=>1;

您基本上做了相同的事情,但是匿名委托在这里看起来显然更好。

+1,但是lambda表达式不是只是重新发明了轮子(相当糟糕,因为我认为匿名方法更有意义)。所以lambda表达式不能有返回值吗?虽然匿名方法可以?SnOrfus:是的,它们做同样的事情,所以你是对的,这只是语法偏好的问题。萨沙:lambdas和匿名方法都可以有返回值。lambdas通过语法快捷方式和类型推断,使匿名委托的使用更加简洁。i=l.Count(委托(字符串x){返回x.Length==2;});i=l.计数(x=>x.长度==2);lambda使用隐含类型,因此“(x,y)=>x+y;”比“委托(intx,inty){return x+y;}”更简洁。当lambda提高可读性时,使用lambda;当匿名委托有意义时,使用匿名委托。