一、匿名方法的定义
匿名方法顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。(Lambda 表达式的本质也是匿名方法。Lambda 表达式提供了一种简洁和富有表现力的方式来创建匿名函数,可以使用 => 运算符来构造 Lambda 表达式。)
Func和Action是两种泛型委托,两者都可以传入参数,但Func是有返回值的,而Action是无返回值的操作,下面主要根据这两种匿名委托讲解一下匿名方法和Lambda的用法。
二、匿名方法和Lambda的使用形式
1、对于Action表达式 //有参传递,传入int类型a,b后计算a+b 匿名方法:Action<int,int> test=delegate(int a,int,b){int c=a+b;} lambda表达式 Action<int,int> test=(a,b)=>{int c=a+b;} //无参传递 匿名方法:Action test=delegate(){int a=5;int b=10;int c=a+b;} lambda表达式 Action test=()=>{int a=5;int b=10;int c=a+b;} 2、对于Func表达式 //有参传递,传入int类型a,b后返回计算a+b结果 //对于Func中的<int,int,int>前两个是传入参数的类型,最后一个是Func的返回值类型 匿名方法:Func<int,int,int> test=delegate(int a,int,b){return a+b;} lambda表达式 Func<int,int,int> test=(a,b)=>{return a+b;} //无参传递 匿名方法:Func<int>test=delegate(){int a=5;int b=10;return a+b;} lambda表达式 Func<int>test=()=>{int a=5;int b=10;return a+b;}
三、使用技巧
1.使用 delegate 运算符时,也可以直接省略参数列表,表示创建的匿名方法可以转换为具有任何参数列表的委托类型。(当方法中参数在返回的结果没有任何作用时,就可以使用弃元。)
Action greet = delegate { Console.WriteLine("你好!"); }; greet(); Action<int, double> introduce = delegate { Console.WriteLine("这就是世界!"); }; introduce(7, 2.5); Func<int, int, int> constant = delegate (int _, int _) { return 42; }; Console.WriteLine(constant(3, 4)); // 输出:42
2.当传入的参数只有一个时,可以省略传入参数的小括号,当运行语句只有一句时,可以省略中括号如:
Action<int> test=a=>console.writeLine(a);
编写 lambda 时,通常不必为输入参数指定类型,因为编译器可以根据 lambda 主体、参数类型以及 C# 语言规范中描述的其他因素来推断类型。
Lambda表达式常用场景是Linq查找和与委托相关的