在前面两篇文章C# 委托的基本概念和C# Action和Func委托中,要使用委托,必须提前把方法写好,但还有新的使用委托的方式,那就是匿名方法。
一、匿名方法
使用匿名方法时,在实例化委托的时候将会有所不同:
class Program
{
static void Main()
{
string mid = ", middle part,";
Func<string, string> anonDel = delegate (string param)
{
param += mid;
param += " and this was added to the string.";
return param;
};
WriteLine(anonDel("Start of string"));
}
}
Func<string, string>委托接受一个字符串参数,返回一个字符串,anonDel就是这个委托变量,实例化的时候,不是把方法名赋予这个变量,而是使用一段代码。
这段代码前面是关键字delegate,后面是一个字符串参数。匿名方法的使用可以使代码更加简洁。当然,如果一个匿名方法需要使用多次,就不要使用匿名方法,编写一个命名方法更好。
但在实践中,我们一般也不使用匿名方法,而是使用lambda表达式。
二、Lambda表达式
从C#3.0之后,可以使用一种新的语法把实现的代码赋予委托,那就是lambda表达式,上面的例子我们就可以修改为lambda表达式:
class Program
{
static void Main()
{
string mid = ", middle part,";
Func<string, string> anonDel = param=>
{
param += mid;
param += " and this was added to the string.";
return param;
};
WriteLine(anonDel("Start of string"));
}
}
lambda运算符"=>"的左边是输入参数,右边是实现的代码。
2.1 定义参数
如果只有一个参数,只写出参数名即可:
Func<string,string> oneParam=s=>$"change uppercase{s.ToUpper()}";
WriteLine(oneParam("test"));
上面的lambda表达式使用了参数s,因为委托类型定义了一个string参数,所以s类型就是string.
如果有多个参数,就把用圆括号将参数名括起来:
Func<double, double,double> twoParams=(x,y)=>x*y;
WriteLine(twoParms(3,2));
上面的lambda表达式,参数x和y的类型是double,由Func<double, double, double>委托定义。
为了方便,可以在圆括号中给变量名添加参数类型:
Func<double, double,double> twoParams=(double x,double y)=>x*y;
WriteLine(twoParms(3,2));
2.2 简写
如果lambda表达式只有一条语句,在方法块内就不需要花括号和return语句,因为编译器会添加一条隐式的return语句:
Func<double, double> square=x=>x*x;
如果有多行代码,就必须添加花括号和return语句:
Func<string, string> anonDel = param=>
{
param += mid;
param += " and this was added to the string.";
return param;
};
注:lambda表达式可以用于类型为委托的任意地方,类型是Expression或Expression<T>时,也可以使用lambda表达式,此时编译器会创建一个表达式树,这个在以后的文章中会提及。
参考:C#高级编程第十版(作者Christian Nagel)