什么是委托?
委托(delegate)是一种托管方法的数据结构,它是一种引用类型,是对方法的引用,如果说int,string等是对数据类型的定义,那么委托就类似于对“方法类型”的定义,声明一个委托,就是声明一种方法签名,和声明的方法签名相同的方法,都可以被委托实例托管。
如何声明一个委托?
delegate 返回值类型 委托名称 (方法参数)
如何使用委托?
声明一种委托类型,需要先实例化,然后通过构造传参或者“+=”的方法为委托实例添加托管方法。
首先,你要确保要添加的方法,是符合委托类型的,也就是方法签名要一致。判断方法签名是否一致的两个要素就是:返回值类型,参数类型、数量,这两项都要一一对应。
请先了解以上三个测试方法,下面进行实例化委托,委托类型为图一所示。
如图,为我们演示了为委托示例添加托管方法的两个方式,那如何使用委托呢,很简单,就像调用一般的方法一样,实例名(参数)。
这样,我们之前为委托实例添加的方法,在调用委托时,就根据添加顺序依次调用了,这种通过委托一次性调用多个方法的过程,称作委托的多播。注意,如果委托是有返回值的,那么执行多播以后,委托的返回值是最后添加的方法的返回值,也就是说,之前的方法返回值被依次覆盖掉了。
有加就有减,我们可以通过“-=”的方式,移除掉某个被委托托管的方法。
Action和Func泛型委托
如果你不知道泛型,也不必担心这两个委托难以上手,Action和Func泛型委托是微软为我们实现定义好的两组委托,这两组委托,足以满足我们的日常使用,而无需自己去定义委托。
先来了解一下它们的定义,
他们都是处于System命名空间下,所以可以拿来即用。
Func委托,它托管有返回值的方法,它的构造方法的重载有17个之多,也就是说,你可以用它匹配最多有16个参数的带有返回值的方法
Action委托,它托管没有返回值的方法,同func委托一样,它可以最多匹配16个参数的无返回值方法
由此,我们上文中的代码就可以重构一下了:
把参数类型或者返回值类型(如果需要它们)写在尖括号中,它的实现原理是泛型,如果不明白泛型,请留意后期的文章。
委托在方法参数中的应用
如果你想实现方法的多样化定制,使用委托作为参数是必不可少的。
想通过一个方法实现不同的操作,可以动态的去改变代码逻辑,这就需要使用委托,用方法封装一些固定的逻辑,用委托方法写不同的代码逻辑,去实现多样化的需求,这就是委托的魅力所在。