委托,一句话简单理解:就是用来传递一个方法。
在方法中我们可以传入各种类型的参数,其中也可以传入一个方法,这个方法就利用委托来传入。
为了理解委托我们来看以下程序
static void Main(string[] args)
{
//现在我有如下几个需求:1,将字符串数组中的每一个元素中的字母都变成小写
//将字符串中的每一个元素中的字母都变成大写
//将字符串中的每一个元素都加上双引号
//将字符串中的每一个元素后都加上一个字符"~"
//首先按照普通的方法来做,每一个需求都写一个方法来调用
string[] strs = { "ABcd", "EfGh", "IJKl", "mnOp" };
//要做到不同的需求就调用不同的方法
ToUpper(strs);//转大写
ToLower(strs);//转小写
AddQuotation(strs);//加引号
AddMark(strs);//加"~"
Console.ReadKey();
}
/// <summary>
/// 将每一个元素中的字母都转为大写
/// </summary>
/// <param name="strs"></param>
public static void ToUpper(string[] strs)
{
for (int i = 0; i < strs.Length; i++)
{
strs[i]= strs[i].ToUpper();
}
}
/// <summary>
/// 将每一个元素中的字母都转为小写
/// </summary>
/// <param name="strs"></param>
public static void ToLower(string[] strs)
{
for (int i = 0; i < strs.Length; i++)
{
strs[i] = strs[i].ToLower();
}
}
/// <summary>
/// 将每一个元素都加上双引号
/// </summary>
/// <param name="strs"></param>
public static void AddQuotation(string[] strs)
{
for (int i = 0; i < strs.Length; i++)
{
strs[i] ="\""+ strs[i]+"\"";
}
}
/// <summary>
/// 将每一个元素的后面都加上"~"
/// </summary>
/// <param name="strs"></param>
public static void AddMark(string[] strs)
{
for (int i = 0; i < strs.Length; i++)
{
strs[i] = strs[i] + "~";
}
}
但在这里我们可以发现,这四个需求调用的方法绝大部分都是完全相同的,只是有一行代码不同:循环里的操作不一样。那我们就想,能不能把不同的那行代码抠出来用一个参数代替,这样我们就可以写出一个通用的总方法了,这里就需要把这行不同的代码当做参数传入方法中,这就是委托了。
现在来申明一个委托,委托要申明在命名空间下,申明的关键字是Delegate
public delegate void DelChange();
我们将上面四个方法中的不同代码抠出来比较一下:
1、strs[i]= strs[i].ToUpper();
2、 strs[i] = strs[i].ToLower();
3、 strs[i] ="\""+ strs[i]+"\"";
4、 strs[i] = strs[i] + "~";
通过比较可知,这四个方法需要的参数都是一个字符串,返回值也是字符串,那么我们申明的委托也必须要有同样的签名:
public delegate string DelChange(string str);
那么将四个方法总写就是:
/// <summary>
/// 含有方法参数的方法
/// </summary>
/// <param name="strs"></param>
/// <param name="del"></param>
public static void ToChange(string[] strs,DelChange del)
{
for (int i = 0; i < strs.Length; i++)
{
del(strs[i]);
}
}
其中委托参数:Delchangedel 就是我们要传入的方法参数了,这里的方法以委托的方式传入。
我们修改一下上面的程序:
public delegate string DelChange(string str);
class Program
{
static void Main(string[] args)
{
//用委托方法来做
string[] strs = { "ABcd", "EfGh", "IJKl", "mnOp" };
//要做到不同的需求就调用不同的方法
ToChange(strs, ToUpper);//转大写
ToChange(strs, ToLower);//转小写
ToChange(strs, AddQuotation); //加引号
ToChange(strs, AddMark); //加"~"
Console.ReadKey();
}
/// <summary>
/// 含有方法参数的方法
/// </summary>
/// <param name="strs"></param>
/// <param name="del"></param>
public static void ToChange(string[] strs, DelChange del)
{
for (int i = 0; i < strs.Length; i++)
{
del(strs[i]);
}
}
/// <summary>
/// 将字符串转为大写
/// </summary>
/// <param name="strs"></param>
public static string ToUpper(string str)
{
return str = str.ToUpper();
}
/// <summary>
/// 将字符串为小写
/// </summary>
/// <param name="strs"></param>
public static string ToLower(string str)
{
return str = str.ToLower();
}
/// <summary>
/// 将字符串加上双引号
/// </summary>
/// <param name="strs"></param>
public static string AddQuotation(string str)
{
return str = "\"" + str + "\"";
}
/// <summary>
/// 将字符串后面都加上"~"
/// </summary>
/// <param name="strs"></param>
public static string AddMark(string str)
{
return str = str + "~";
}
这样就实现了将方法当做参数的形式传入另一个方法了。