作为C#语言基础中的最后一个环节,灵活的使用委托、匿名函数、lambda表达式的概念能为我们的高级编程节省不少代码。并且委托的思想能够让程序更加模块化,更便于程序的扩展和功能添加。下面我们通过一个案例来介绍委托这些概念。
当我们有这样一个需求,我们需要对字符串数组里面的元素都都进行处理以下处理:
1,全部转换成大写字母。
2,全部转换成小写字母。
3,全部加双引号。
在这种情况下一般的实现方法是我们分别定义三个函数,然后根据需要调用我们要执行的方法。
全部代码如下:
//定义对数组进行这三个操作的函数:
//将字符串数组中的字符串全部大写的函数。
public static void ToUpper(string[] str)
{
for(int i=0;i<str.Length;i++)
{
str[i]=str[i].ToUpper();
}
}
//将字符串数组中的字符串全部小写的函数:
public static void ToLower(string[] str)
{
for(int i=0;i<str.Length;i++)
{
str[i]=str[i].ToLower();
}
}
//将字符串数组中的字符串全部加双引号的函数:
public static void Add(string[] str)
{
for(int i=0;i<str.Length;i++)
{
str[i]=\"+str[i]+\";
}
}
//代码实际调用部分:
根据需要选择要调用哪个函数,如下面我们要声明一个字符串数组,并将里面的所有字符串大写:
string[] str=new string[]{"aBc","DeF","GHi","jkL"};
ToUpper(str);
//以上方法但是如果存在这样一个需求,我们需要学一个通用代码,根据客户的需求来决定是否写调用大写函数或小写函数或者加双引号的函数。那么就要引入委托的概念。
//我们可以定义一个委托,然后把委托作为形参给通用调用函数,然后当我们需要进行什么操作的时候就将哪个函数传入给通用调用函数。这样我们就实现了把方法作为一个参数来传入。
//定义委托的代码:
//委托定义注意点:
//1,委托必须和要赋值给委托的方法的签名一致(签名一致有两个方面:参数一致、返回值一致)
public delegate void DeOperate(string[] str);
//通用调用函数代码:
public void string Operation(string[] str,DeOperate operate)
{
//用委托实参调用传递给通用调用函数的字符串数组
operate(str);
}
有了以上代码当我们需要对字符串数组里面的所有字符串进行转化大写字母的时候就可以使用通用调用函数,代码如下:
Operation(str,ToUpper);
仔细思考发现使用委托还是没有解决精简代码的根本问题,即使我们使用委托能够将主程序代码尽量精简,但是代码精简始终是个问题。于是我们引入匿名函数的概念。如果一个函数只使用一次,那么我们可以使用匿名函数来解决,而不必为每个函数定义一个方法。
//使用匿名函数用通用代码调用匿名函数方式来让字符串数组中的所有字符串全部大写。
Operation(string[] str,delegate(string[] str){
for(int i=0;i<str.Length;i++)
str[i]=str[i].ToUpper();
});
这样我们就能够让只执行一次的代码精简化,不用特意为只执行一次的方法定义一个方法:
注意:匿名函数也是一个函数,只是没有名字。
同样,匿名函数也可以用lambda表达式表示,如上面的代码可以用lambda表达式实现。
Operation(string[] str,(string[] str)=>{
for(int i=0;i<str.Length;i++)
{
str[i].ToUpper();
}
});
这就是lambda表达式。
下面我们对委托、匿名函数、lambda表达式做一个总结:
委托:
委托可以看做是一个抽象的方法,可以将签名相同的方法赋值给一个委托,这种抽象化能够将签名相同的代码写成一个通用的调用。
匿名函数:
匿名函数是一个没有名称的函数。
lambda表达式:
匿名函数的一个代替方式,使用lambda表达式代替匿名函数显然是一个更简洁的办法。