关于委托、匿名方法、Lambda表达式的演变过程
一:委托
//声明委托类型
public delegate void MyDelegate(param1,param2,param3)
//定义与委托兼容的方法
public void function_name(param1,param2,param3)
{
}
//创建委托实例(即委托引用方法)
//常规的标准的创建一个委托实例,最原始的
1:MyDelegate del = new MyDelegate(function_name);
//简写或简化的写法,
2:MyDelegate del = function_name;
二:匿名方法
后期为了进一步简略代码,把方法的定义与被引用合并到了一起(不再单独定义function_name方法),从而引出了“匿名方法”(使用delegate关键字)
//声明委托类型
public delegate void MyDelegate(param1,param2,param3)
//创建委托实例(即委托引用方法)
1:MyDelegate del = new MyDelegate(delegate(param1,param2,param3){/*方法体*/});//注意匿名方法的参数签名要与委托类型的签名兼容
//简化版
2:MyDelegate del = delegate(param1,param2,param3){/*方法体*/};//注意匿名方法的参数签名要与委托类型的签名兼容
三:Lambda表达式
再后来,出现了lambda表达式,这样委托出现的地方,都可以使用lambda表达式来替换
1:语句lambda
param1... => {/*方法体*/}
2:表达式lambda
param1... => param1=true
说明:文中的“兼容”不是指类型完全相同,只要符合is a原则,也算是兼容。
四:实例应用
private ICommand startCommand;
public ICommand StartCommand
{
get
{
if (startCommand == null)
{
startCommand = new RelayCommand(param =>
{
Start();
}, param => true);
} return startCommand;
}
}
//语句lambda(有代码体,或者说方法体)=》委托类型的参数
param =>
{
Start();
}《=》委托(无返回值+一个参数)
//表达式lambda,该表达式的值就是true
param => true《=》布尔类型的参数(bool flag)
委托:方法的引用
委托最重要的两个地方(返回值+参数列表)
委托出现的地方大部分可以用lambda表达式(即语句lambda)替换