c#lambda表达式 和匿名函数的区别

2026年09月22日 06:39
有1个网友回答
网友(1):

匿名函数(Anonymous Function)是表示“内联”方法定义的表达式。匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型。匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托;如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树。

匿名函数有两种语法风格:Lambda表达式(lambda-expression)和匿名方法表达式(anonymous-method-expression)。在几乎所有的情况下,Lambda表达式都比匿名方法表达式更为简介具有表现力。但现在C#语言中仍保留了后者,为了向后兼容。

  • Lambda表达式:
    async可选 (匿名的函数签名)=> (匿名的函数体)

  • 匿名方法表达式:
    async可选 delegate (显式的匿名函数签名) 可选{代码块}

其中匿名的函数签名可以包括两种,一种是隐式的匿名函数签名另一种是显式的匿名函数签名:
隐式的函数签名:(p)、(p1,p1)
显式的函数签名:(int p)、(int p1,int p2)、(ref int p1,out int p2)
匿名的函数体可以是表达式或者代码块。


从上面我们可以看出,Lambda表达式的参数形式可以显式或者隐式类型化。在显式类型化参数列表中,每个参数的类型是显式声明的,在隐式类型化参数列表中,参数的类型是从匿名函数出现的上下文中推断出来的。
当Lambda表达式只有一个具有隐式类型化参数的时候,参数列表可以省略圆括号,也就是说:
(参数) => 表达式
可以简写为
参数 =>  表达式

一些匿名函数的示例

    x => x + 1                                //隐式的类型化,函数体为表达式 
  x => {return x + 1;}                      //隐式的类型化,函数体为代码块 
  (int x) => x + 1                          //显式的类型化,函数体为表达式 
  (int x) => {return x + 1;}                //显式的类型化,函数体为代码块 
  (x , y) => x * y                          //多参数 
  () => Console.WriteLine()                 //无参数 
  async (t1 , t2) => await t1 + await t2    //异步 
  delegate (int x) {return x + 1;}          //匿名函数方法表达式 
  delegate {return 1 + 1;}                  //参数列表省略

Lambda表达式和匿名方法表达式的区别:

  1. 当没有参数的时候,匿名方法表达式允许完全省略参数列表,从而可以转换为具有任意值参数列表的委托类型,Lambda表达式则不能省略参数列表的圆括号()。

  2. Lambda表达式允许省略和推断类型参数,而匿名方法表达式要求显式声明参数类型。

  3. Lambda表达式主体可以为表达式或者代码块,而匿名方法表达式的主体必须为代码块。

  4. 只有Lambda表达式可以兼容到表达式树类型。