delegate event小结(c#)
这个东西经常用,可是必须是在coding的状态下,要有智能提示,甚至某时错了,编译器帮忙查查错。上天去面试了,发现用笔写,不知道怎么下笔了。后来反思,应该还掌握的不够透吧,趁2012来临之际,把这个总结下,算是给自己有个交待,不会在末日的世界里糊里糊涂了。
1.delegate:
这个鸟玩意其实没有那么它听起来的那么重要,并不是每次遇到问题时候的第一选择。可是确实有些时候,为了代码的简约,它不失为一个很好的选项,甚至有些时候,它甚至是必须的选项,比如回调。。。。
delegate是啥玩意,能用来干什么的? 这个现在我也不知道,小结嘛,都是通过很多个测试后总结出来的。(如果我能很流利、清晰的说出来,我也就不会写这个东西了)
先看个简单的例子:
1using System.Text;
3
4 namespace ConsoleApplication1
5 {
6 class EventAndDelegate
7 {
8 delegate void DoSomething(string name);
9
10 static void Main(string[] args)
11 {
12 DoSomething print = new DoSomething(PeopleDoSomething);
13 print("Jim");
14 Console.ReadKey();
15 }
16
17 static void PeopleDoSomething(string pName)
18 {
19 Console.WriteLine(string.Format("Hi ,I am {0}", pName));
20 }
21 }
22 }
这个例子估计是最简单的delegate的例子了,但是也是最让人容易产生疑惑的例子。
简单的是:非常简单明了的演示了如何使用delegate:
1.定义一个delegate:必须要指出返回类型,以及参数
2.在你想要使用delegate的class里面实现一个(至少一个)跟该delegate返回类型于参数完全一致的方法,这里是static void PeopleDoSomething(string pName)
3.通过new 实例化一个实例出来(呵呵,这里可以看出一点端倪出来喽,delegate就是一个class嘛) ,实例化的时候,需要给它传递一个方法作为参数,这个是必须的,我们无法写出这样的语句:DoSomething print=new DoSomething();//这样你根本编译不通过,因为delegate不接受无参的实例化方式
4.像调用方法一样去调用你实例化出来的delegate实例
让人容易产生疑惑的是:这是一个非常犯贱的举动。
因为实现打印出 people name的事情,完全可以通过 EventAndDelegate.PeopleDoSomething("Jim");来实现,又声明delegate的,又实例化。。。一系列的操作后,干出的事情也没有华丽到哪里去。
容易理解没什么好说的,这里容易让人产生疑惑的原因是这个例子干的事情太简单了,完全不能体现出delegate的优势来。可是这个是很让人两难的事情,讲解一个东西,一般肯定都是从最最基本的讲起,可是简单的过分了,就体现不出要讲的东西的价值了。
anyway,这个例子的至少让我们对delegate有了一个最基本的认识了:
delegate是一个class,尽管它比较特殊;它规定了它即将代理的方法的返回类型和传递的参数;我们可以像调用方法一样的方式去调用delegate的实例。
但是疑惑并没有解决,这样做看不出用delegate的必要性。 所以像上面的这个例子不是好例子,因为它确实体现不出delegete的优点来。delegete之所以被面试的时候无数次问道,就是它有点小复杂,复杂不是故意弄出来的(像上面的那个简单的例子),在碰到一些稍微困难的问题时候,它确实有着一定的优势。
说说它的几个优势的地方:
1.降低耦合。
浙公网安备 33010602011771号