引言
进入项目组一段时间了,感觉对C#还是一知半解,正好老大要求复习基础知识,然后整理资料来进行复习,借着这股东风,就好好的把委托和时间又复习了下。
关于委托和事件,在.net里面简直太重要了,但是理解它也往往是个门槛,当初看它怎么都看不懂,慢慢的才明白一些。就把自己的理解写一下。
最后,再推荐一下两篇写的很好的文章,是大牛写的,百度百科上委托和事件的文章就是他写的这篇文章节选的。通俗易懂,对于理解委托和时间非常有帮助。
一.什么是委托?
委托是寻址方法的.NET版本。在C#中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的。我们无法判断这个指针实际指向什么,像参数和返回类型等项就更无从知晓了。而,blET委托完全不同,委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对方法的引用,也可以包含对多个方法的引用。
上面是《C#高级编程》里面对委托的解释。算是比较官方的解释了吧,但是比较晦涩。
按照我个人理解,委托主要作用之一就是可以将一个方法作为参数传到函数中去,我当时学习的时候就很疑惑,为什么要用方法作为参数传到里面去,因为有些时候你(或者是计算机)无法提前知晓到时候用的方法或者类型。还是很难懂的话,就举个例子,我比较喜欢看武侠小说,估计程序员很多也喜欢,就拿天龙八部里面的慕容复做例子。读过过小说或者看过电视剧的同学知道,慕容复和他老爹很有名,最大的特点就是可以模拟对手的招数,以其人之道还治其人之身。OK,今天不是来跟大家讨论小说,咱们要做一个慕容复,用程序控制他,慕容复小的时候,只会一门武功。假设就是拈花指(拈花指好像是少林高级功夫,不管了,就当他是genius),下面是他的招数:
public void Nianhuazhi()
{
Console.WriteLine("发出招式:拈花指");
}
那么慕容少爷打架的时候,就会调用招数:
public void Fight(string zs)
{
Nianhuazhi();
}
这没什么问题,就会这一招没办法,就像当年的郭靖只会“亢龙有悔”,也很牛x。
OK,现在慕容复长大了,会这招数多了,如下:
public void Nianhuazhi()
{
Console.WriteLine("发出招式:拈花指");
}
public void Xianglongzhang()
{
Console.WriteLine("发出招式:降龙十八掌");
}
public void Dalizhang()
{
Console.WriteLine("发出招式:大力金刚掌");
}
打架的时候选择也多了,每次发招的时候有很多选择,咱们应该这样控制他,每次发招想用什么就把名字告诉他,他就会攻击了。
public void Fight(string zs)
{
switch (zs)
{
case "Xianglongzhang":
Xianglongzhang();
break;
case "Nianhuazhi":
Nianhuazhi();
break;
case "Dalizhang":
Dalizhang();
break;
}
}
等等,这位可是号称天下武功无所不会的童鞋,那往后岂不是要学一门武功,加一个case吗?那也太烦了,要是学上几百种……
public void Fight(string zs)
{
switch (zs)
{
case "Xianglongzhang":
Xianglongzhang();
break;
case "Nianhuazhi":
Nianhuazhi();
break;
case "Dalizhang":
Dalizhang();
break;
……
……
}
}
有没有一种办法,可以不用传名字,而是可以这样,直接将招式的方法传过去?好比
public void Fight(某类型 招式)
{
招式
}
恩,估计你也知道了,委托千呼万唤始出来,尤抱琵琶半遮面
public delegate void Zhaoshi();
static void Main(string[] args)
{
Fight(Nianhuazhi);
}
往后想用什么直接把函数传过去就好,怎么样,方便很多吧。这就是委托。就是一个函数的代号而已,不是什么神秘的东西