C#知识梳理——委托
什么是委托
委托是一个类型,一个引用类型,用来保存方法的指针(指向一个方法)!如果借用C/C++的概念来理解,那么,委托就是函数指针!
当我们调用委托的时候,这个方法就立即被执行。
关键字就是delegate 定义的时候要传和前面一样的方法

但是为什么不直接用Hello呢?不是可以一样得到这样的结果吗?
在C#中,委托(Delegate)是一种引用类型,它可以封装一个或多个方法,并允许以相同的签名调用这些方法。使用委托可以提供以下几个好处:
封装方法:委托允许你将一个或多个方法封装到一个对象中,并将其作为参数传递给其他方法或存储在变量中。这样可以更方便地操作和传递方法,使代码更加模块化和可重用。
回调机制:委托可以用作回调机制的基础。当某个事件发生时,可以调用委托来触发注册的方法,从而实现事件的异步处理。
简化多线程编程:在多线程编程中,委托可以用来实现线程间的通信和同步。通过将方法封装到委托中,并在不同的线程中调用委托,可以方便地实现线程的启动、暂停、恢复等操作。
扩展方法的功能:委托可以用来扩展方法的功能,使其具有更高的灵活性。通过传递不同的委托实例,可以在不修改原有代码的情况下改变方法的行为。
总的来说,使用委托可以提高代码的灵活性、可重用性和可维护性。它可以帮助你更好地管理方法并实现各种编程模式,例如事件驱动、回调和多线程编程。
但是这几句话,好像并不能为什么要有委托这个题目的答案,因为这些好像都不是它存在的必要的条件。
所以,为什么要有委托

既然这么简单,为什么还要委托来做?
但是,如果方法发生了变动,该怎么办?

利用委托将方法中判断的部分摘出来,写成一个新的方法,与委托关联,那么可以在不动主体代码的条件下,去改动判断条件。
梳理一下


那么,可以得出一个问题,委托可以解放冗长的代码,把一个方法可以实现的功能模块化。实现代码的高灵活性。
委托与冒泡排序
第二种方法
委托的方法
到时候,想升序或者降序,只要换一下方法就可以了。

泛型委托
目的是定义一个委托出来,在很多类型的情况下都可以使用。
其实官方已经定义好了,即Action(不带返回值) 、Func(带返回值)


多播委托
多播委托(Multicast Delegate)是一种特殊类型的委托,它可以同时持有并调用多个方法。在.NET框架中,多播委托是通过将多个委托实例合并成一个委托实例来实现的。
多播委托的定义如下:
delegate void MyDelegate();
MyDelegate multicastDelegate = method1;
multicastDelegate += method2;
multicastDelegate += method3;
上述代码中,multicastDelegate是一个多播委托,它同时持有method1、method2和method3三个方法。
多播委托的主要用途是在事件处理中,同时调用多个事件处理方法。当事件触发时,所有注册到多播委托的方法都会被依次调用。
多播委托有以下特点:
多播委托可以持有多个方法,并按照添加的顺序依次调用这些方法。
多播委托可以使用+=运算符添加方法,使用-=运算符移除方法。
多播委托的调用顺序是确定的,即使其中的某个方法抛出异常,其他方法仍然会被继续调用。
多播委托可以使用GetInvocationList()方法获取委托中包含的所有方法。
需要注意的是,多播委托只能用于返回类型为void的方法。如果委托的方法有返回值,则只能调用最后一个方法的返回值。
事实上,每一个委托都是继承自多播类!


匿名表达

发现只返回一个

说明带返回值的多播委托只返回最后一个方法的值
委托事件
事件就像是另一种加了限制的委托。
什么是事件:委托的安全版本 1、定义在事件类的外部,不能使用=操作,只能用+=,2、在定义事件类的外部,不能调用事件。另外事件就是在委托的前面加一个event关键字。

Winform里的事件


自定义标准事件
流程:1、定义一个委托——>2、定义一个调用和定义事件的类(发布者、安全性)——>3、订阅事件(+=)——>4、类、方法(订阅者)
