匿名函数 (anonymous function) 是表示“内联”方法定义的表达式。匿名函数本身及其内部没有值或类型,但可以转换为兼容委托或表达式树类型。匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托值。如果目标类型为表达式目录树类型,则转换将计算以对象结构形式表示方法结构的表达式目录树。
lambda-expression形式的匿名函数的参数可以显式或隐式类型化。在显式类型化参数列表中,每个参数的类型是显式声明的。在隐式类型化参数列表中,参数的类型是从匿名函数出现的上下文中推断的,具体而言,当匿名函数转换为兼容委托类型或表达式目录树类型时,该类型提供参数类型(第6.5节)。
在具有一个隐式类型化参数的匿名函数中,参数列表中可以省略括号。换言之,具有以下形式的匿名函数
( param ) => expr
可以简写为
param => expr
anonymous-method-expression形式的匿名函数的参数列表是可选的。如果提供了参数,则参数必须显式类型化。如果未给出参数,则匿名函数可以转换为带有不含out参数的参数列表的委托。
除非匿名函数出现在不可到达的语句内,否则该匿名函数的block是可到达的(第8.1节)。
下面是一些匿名函数示例:
x => x + 1                                 // Implicitly typed, expression body
x => { return x + 1; }                     // Implicitly typed, statement body
(int x) => x + 1                           // Explicitly typed, expression body
(int x) => { return x + 1; }           // Explicitly typed, statement body
(x, y) => x * y                            // Multiple parameters
() => Console.WriteLine()              // No parameters
async (t1,t2) => await t1 + await t2   // Async
delegate (int x) { return x + 1; }     // Anonymous method expression
delegate { return 1 + 1; }                 // Parameter list omitted
lambda-expression和anonymous-method-expression的行为除以下几点外是相同的:
·        anonymous-method-expression允许完全省略参数列表,从而可转换为具有任意值参数列表的委托类型。
·        lambda-expression允许省略和推断参数类型,而anonymous-method-expression要求显式声明参数类型。
·        lambda-expression的主体可以为表达式或语句块,而anonymous-method-expression的主体必须为语句块。
匿名方法和lambda表达式:
using System;using System.Collections.Generic;namespace _146_匿名方法和lambda表达式{class Program{public delegate void DelOne();public delegate void DelTwo(string name);public delegate string DelThree(string name);static void Main(string[] args){DelOne del1 = delegate () { };del1 = () => { };DelTwo del2 = delegate (string name) { };del2 = (string name) => { };DelThree del3 = delegate (string name) { return name; };del3 = (string name) => { return name; };//使用lambda表达式来删除指定元素List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };list.RemoveAll(n => n > 4);//foreach (var item in list){Console.WriteLine(item);}Console.ReadKey();}}}
