匿名函数(Anonymous Function)是表示“内联”方法定义的表达式。匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情)。匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托;如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树。
匿名函数有两种语法风格:Lambda表达式(lambda-expression)和匿名方法表达式(anonymous-method-expression)。在几乎所有的情况下,Lambda表达式都比匿名方法表达式更为简介具有表现力。但现在C#语言中仍保留了后者,为了向后兼容。
匿名函数有两种形式:lambda表达式、匿名方法
ambda表达式:
async可选 (匿名的函数签名)=> (匿名的函数体)
匿名方法表达式:
async可选 delegate (显式的匿名函数签名) 可选{代码块}
匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法
匿名函数是通过使用 delegate 关键字创建委托实例来声明的。例如:
using System;
namespace niminghanshu
{
delegate void test();//声明委托
class Program
{
static void Main(string[] args)
{
//匿名函数格式 delegate(参数列表){代码块};
test aa = delegate () { Console.WriteLine("hello,world"); };
aa();//调用委托
Console.ReadKey();
}
}
}
注意: Console.WriteLine("hello,world");是匿名函数的主体;
如果要使用有参数或有返回值的匿名函数就必须声明对应类型的委托:
把上面的例子改一下:
using System;
namespace niminghanshu
{
delegate int test(int a);//声明委托
class Program
{
static void Main(string[] args)
{
//匿名函数格式 delegate(参数列表){代码块};
test aa = delegate (int number)
{
Console.WriteLine("hello,world");
return number;
};
int numbers = aa(10);
Console.ReadKey();
}
}
}
Lambda表达式和匿名方法表达式的区别:
● 当没有参数的时候,匿名方法表达式允许完全省略参数列表,从而可以转换为具有任意值参数列表的委托类型,Lambda表达式则不能省略参数列表的圆括号()。
● Lambda表达式允许省略和推断类型参数,而匿名方法表达式要求显式声明参数类型。
● Lambda表达式主体可以为表达式或者代码块,而匿名方法表达式的主体必须为代码块。
● 只有Lambda表达式可以兼容到表达式树类型。
值得注意的是:匿名方法主体后面都以“;”结尾。
本文转自 宁金峰 51CTO博客,原文链接:http://blog.51cto.com/13243523/2043412,如需转载请自行联系原作者