CSharp中委托(一)委托、匿名函数、lambda表达式、多播委托、窗体传值、泛型委托

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

委托就是一种类型:一种表示标明函数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。
}

本来这个方法是要调用上面那三个函数来实

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值