匿名函数 (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();
}
}
}