C# -- 委托(一)

概念

• 关于委托的概念呢,在网上看了好多,刚开始很懵,说法太多太乱,可能要去理解这些抽象的东西时候,需要一个接收过程吧,需要一定的时间去消化这些抽象知识。

• 今天在这里我按我自己的理解去总结一下关于委托的相关基础知识。希望对大家有所帮助,大家也不要把委托想成一个多么复杂的概念,其实如果光理解概念的话的非常简单。

“委托”如果翻译成汉语意思大家都应该明白,比如:我委托张三帮我买一个棒棒糖,那么在C#中这个张三就是一个委托,就是明明自己可以干的事,自己偏不干,让一个有同样能力的人去干,举个例子:

• 在大山里,一名猎户父亲,想吃野味,但是自己并不去打猎,而是让自己的“儿子”去打猎,在C#中,这里猎户的“儿子”就是委托。大儿子可能只会打飞鸟,所以猎户父亲想吃飞鸟肉,就让大儿子去,二儿子只会打走兽,所以猎户父亲想吃走兽肉,就让二儿子去。

• 说白了,就是自己明明可以做的事,让别人帮你来做,估计就有人会想,这有啥用啊,我想做一件事,明明可以直接去做,非要让别人去做,有什么意义呢?其实仔细想一想,自己如果直接去做,这样双方是有直接联系的,而如果让别人来帮你做,就相当于中间插了一个中介一样,什么事都有它来做,出了什么事全由它负责,这样原来的双方就实现了解耦了。

正式进入主题:

Delegates委托

委托是一个对象,它知道如何调用一个方法.

委托类型和委托实例

委托类型定义了委托实例,可以调用的那类方法,具体来说,委托类型定义了方法的返回类型和参数,说白了,就是委托是什么类型的,有什么样的参数,就可以调用什么样的方法,就好比上边例子中的“王五”和“月月”一样,一个只能找男生,一个只能找女生,那么在C#中委托也是,有的委托只能找到int类型的方法,有的只能找到string类型的方法,有的可以找到string类型而且带参数的方法。

委托的定义

delegate   <类型>   委托名称(<参数类型>  参数名称)  比如: delegate int TestDel(int num)  这就是一个委托,这个委托很牛掰,在程序中,我们只有想调用int类型并且带一个int类型参数的方法,都可以找这货让它去调用,它都能调用。

委托实例

把方法赋值给委托变量的时候,就创建了委托实例,比如:我们将一个int类型并且带有参数的方法赋值给了上边的TestDel的时候,就创建了实例,我们就可以通过这个实例来调用这个方法。就好比我要让“张三”帮我买棒棒糖一样,当张三付账后,棒棒糖到他手里时候,就创建了实例,我就可以从张三手里去拿糖,在C#程序里就是把能调用的方法给委托,我再从委托里调用该方法。

直接来看代码:

一目了然了吧!!!!!!

在Main方法里,我们想调用Square()这个方法,我们并没有直接  int result = Square(10)    而是先实例一个委托变量,再把Square()方法扔给了这个变量,再通过这个变量调用Square()方法!!!!!!

在这里,调用者Main方法和被调用者Square方法它们之间进行解耦了。上方写法是简写,其实完整写法如下:

编写插件式的方法

方法是在运行时才赋值给委托变量的,如下:

新建一个类:

然后在main方法调用:

在上方代码中,我们把委托类型提到类的外边了。我们新建一个Util类,里边有个Transform()方法,第一个参数是一个数组,第二个参数就是上边那个委托类型的变量,里边的逻辑就是遍历数组,数组里边的值当做委托目标方法(Square)的参数,然后通过委托调用目标方法,在main方法里,我们将原始数组和Square()方法传入到Transform()里,最后将经过Square()方法处理后的数组里边的值,赋值给原始数组,最后打印输出。

这就写出一个插件式的方法!!

多播委托

所有都委托实例都具有多播的能力,一个委托实例可以引用一组目标方法,这个比较简单,直接上图:

先调用Square()再调用Square1(),调用的顺序,和它们定义顺序是一样的。

同样,委托可以合并,也可以移除,把+=改成  -= 就行了!

委托变量使用“加等”操作符时,其操作数可以是null,就相当于把一个新的值赋值给了委托变量;

对单个目标方法的委托变量,使用“减等”操作符时就相当于又把null值赋值给了委托变量;这里就不上图了;

另外:

委托是不可变的,使用加等或减等操作符时,实际上是创建了新的委托实例,并把他赋给当前的委托变量,如果多播委托的返回类型不是void,那么调用者从最后一个被调用的方法来接收返回值,前面的方法仍然会被调用,但是其返回值就会被弃用了,上图中有,这里就不举例了

另外:

今天暂时学这么多!明天继续!!!!!

posted @ 2020-08-13 18:45  初晨~  阅读(154)  评论(0编辑  收藏  举报