匿名函数
匿名函数(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表达式和匿名方法表达式的区别:
● 当没有参数的时候,匿名方法表达式允许完全省略参数列表,从而可以转换为具有任意值参数列表的委托类型