委托就是一种类型:一种表示标明函数de类型的类。
因此,可将函数作为参数变量传来传去。
而将函数作为参数传递给委托类型的变量,相当于将函数看做参数传入函数中。
符号:=>:就是将参数传递给函数(匿名的话就是:函数体)
定义一个委托,相当于定义了一个类。因此写在类外面。
声明委托类型的类时,这个类,要跟被委托的函数有相同的签名(参数和返回值)。
要用这个委托类型的类去声明变量,以此变量用来传递函数。
被委托的函数:将要作为参数传递的函数。
委托
先来个例子:
三个需求:
1、将一个字符串数组中每个元素都转换成大写
2、将一个字符串数组中每个元素都转换成小写
3、将一个字符串数组中每个元素两边都加上 双引号
string[] names = { "abCDefG", "HIJKlmnOP", "QRsTuvW", "XyZ" };
//StrToLower(names);
StrToUpper(names);
//StrSYH(names);
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(names[i]);
}
用三个方法分别去实现。
public static void StrToUpper(string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = name[i].ToUpper();
}
}
public static void StrToLower(string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = name[i].ToLower();
}
}
public static void StrSYH(string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = "\"" + name[i] + "\"";
}
}
三个方法有大量相同重复代码,只有少部分是不同的。而且写完方法,三个功能要用三个函数,我们希望一个函数搞定。
首先解决用一个函数来实现这三个功能,将下面的三个函数名作为参数,来输入到这个函数中。用哪个函数名,就实现哪个函数的功能。
那么将函数名作为实参传入函数的这种操作,我们称为委托。
实质:将函数名作为参数传入函数中。将原函数要实现的功能,委托给一个新函数来实现。函数指针。指向函数。
函数名作为一个值传递给一个变量,这个变量必定有一个类型,这个类型就是我们提到的委托类型:新的类型关键字:delegate。
声明一个委托类型,委托所指向(非常类似指针)的函数,必须跟委托具有相同的签名(参数和返回值)。
(C/C++中,指针指向的变量类型相同,int*类型的指针指向int类型变量,char*类型的指针指向char类型的变量)
C语言中:函数指针就是指向函数的指针。
这个委托可以看做是一个指向函数的指针类型。
回到我们的需求案例中,如上,函数没有返回值,但是有一个string[]类型的输入。委托写的位置是:类外,命名空间里面。因此声明委托如下:
public delegate void DelStrTo(string[] name);
写一个方法,将需要委托的函数作为参数传入,相当于传递一个方法过来。
这个参数的类型为刚才声明的委托类型:即:DelStrTo类型。
标明函数这个参数位置需要传入一个什么类型(函数签名相同)的函数方法:
public static void Test(string[] name, DelStrTo del)
{
del(name); //委托需要一个参数,写入name。
}
本来这个方法是要调用上面那三个函数来实

本文深入探讨了委托的概念,包括其定义、使用方法及应用场景,并介绍了匿名函数与lambda表达式的应用技巧,最后通过实例展示了多播委托及泛型委托的使用。
最低0.47元/天 解锁文章
2225

被折叠的 条评论
为什么被折叠?



