委托(delegate)
C语言中的描述:函数指针
实际上,委托在某种程度上提供了间接的方法。换言之。不需要直接指定一个行为,而是将这个行为用某种方式“包含”在一个对象中。这个对象可以像其他任何对象那样使用。在该对象中,可以执行封装的行为。可以选择将委托看做之定义了一个方法的接口,将委托的实例看做实现了那个接口的一个对象。
C#中的委托和现实世界中的遗嘱很像,是需要在恰当的时间执行一系列的操作。如果代码想要执行操作,但不知道操作细节,一般可以使用委托。(我们可以想象成这样,以为老人将遗嘱交付给他的律师,希望将他的财产按意愿分配给子女和慈善机构。这件事情在他过世后的某个时间段会被执行,但他不会知道执行的具体细节,例如律师是在哪一天哪个地点召集相关人员来宣读他的遗嘱)。
简单委托的构成:
1.声明委托类型
2.必须有一个方法包含了要执行的代码
3.必须创建一个委托实例
4.必须调用(invoke)委托实例
对1:委托类型的声明=关键字+返回类型+委托名+参数列表。例如delegate void StringProcessor(string input);
对2:委托需要一个方法来做我们想做的事情。就以上面的遗嘱为例,律师可以帮忙实现遗嘱的内容,但是他不能决定遗嘱的内容,遗嘱具体牵涉到哪几个人,如何分配财产这些问题通通要由老人来决定。当然,放到代码上来说,同时要求方法要具有和委托类型相同的签名(其实也可以想象成有一类律师是专门来为他人处理遗嘱问)。基本思路是,要确保在调用(invoke)一个委托实例时,使用的参数完全匹配,而且能以我们希望的方式使用返回值。例如针对1的方法就是
void PrintString(string x)
对3:有了一个委托类型和一个正确前面的方法,就可以创建委托类型的一个实例,指定在调用委托实例的时候就执行该方法。
例如 StringProcessor proc1,proc2;
proc1=new StringProcessor(StaticMethod.PrintString);
InstanceMethods instance=new InstanceMethods();
proc2=new StringProcessor(instance.Printstring);
用现实生活中的事可以这么理解,专门处理遗嘱的律师有很多个,需要被委托的遗嘱也有很多份,要让遗嘱能够真正被兑现,就要把其中某一份具体的遗嘱委托给某一个具体的律师,使他们之间产生关系,对律师来说,是拥有了可以行使宣读这份遗嘱并保证它按立嘱人的意愿被实现等权利,对遗嘱来说,是拥有了被实现的功能。一旦找到这个律师,也就可以实现这份遗嘱了。
对4:调用委托实例。
如果只创建了委托实例却不在某一时刻去调用它是没有任何意义的。就像一位被老人委托了遗嘱的律师,如果他将这份遗嘱隐藏起来不去实现的话那么遗嘱的内容将永远无法发挥作用。调用委托实例时只要调用委托实例的方法就可以了。这个方法本身被称为Invoke.这个方法以委托类型的形式出现,并且具有与委托类型的声明中所指定的相同参数列表和返回值。所以,在上面的例子中,有一个像这样的方法:void Invoke(string input).