概念
关于委托的概念呢,在网上看了好多,刚开始很懵,说法太多太乱,可能要去理解这些抽象的东西时候,需要一个接收过程吧,需要一定的时间去消化这些抽象知识。
今天在这里我按我自己的理解去总结一下关于委托的相关基础知识。希望对大家有所帮助,大家也不要把委托想成一个多么复杂的概念,其实如果光理解概念的话的非常简单。
“委托”如果翻译成汉语意思大家都应该明白,比如:我委托张三帮我买一个棒棒糖,那么在C#中这个张三就是一个委托,就是明明自己可以干的事,自己偏不干,让一个有同样能力的人去干,举几个例子:
1:在学校里,你是一名老师,你要找一个叫“张三”的男生,但是你不找,你让一个认识“张三”的人去帮你找,假如这个人叫“王五”,那么在C#中,王五就是一个委托,王五这个人很厉害,他可以找到学校里所有男生,所以只有你找在当前学校里的男生,都可以委托他来帮你找。同样,如果你想找一个叫“丽丽”的女生,但是你不找,你让一个认识“丽丽”的人去找,假如这个人叫“月月”,那么在C#中,“月月”就是一个委托,月月这个人很厉害,他可以找到学校里所有女生,所以只有你找在当前学校里的女生,都可以委托她来帮你找。
2:在大山里,一名猎户父亲,想吃野味,但是自己并不去打猎,而是让自己的“儿子”去打猎,在C#中,这里猎户的“儿子”就是委托。大儿子可能只会打飞鸟,所以猎户父亲想吃飞鸟肉,就让大儿子去,二儿子只会打走兽,所以猎户父亲想吃走兽肉,就让二儿子去....................
3:在生活中,张三要去打官司,但是他自己不打,让一名律师去打,在C#中,这里的“律师”就是委托。
4:在程序中,要调用一个方法,但是,不直接写“方法名”调用,而是先找到另一个东西,让另一个东西去调用...................................
.....................................................
说白了,就是自己明明可以做的事,让别人帮你来做,估计就有人会想,这有啥用啊,我想做一件事,明明可以直接去做,非要让别人去做,有什么意义呢?其实仔细想一想,自己如果直接去做,这样双方是有直接联系的,而如果让别人来帮你做,就相当于中间插了一个中介一样,什么事都有它来做,出了什么事全由它负责,这样原来的双方就实现了解耦了。
正式进入主题:
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,那么调用者从最后一个被调用的方法来接收返回值,前面的方法仍然会被调用,但是其返回值就会被弃用了,上图中有,这里就不举例了
另外:
今天暂时学这么多!明天继续!!!!!