delegate event小结(c#)

这个东西经常用,可是必须是在coding的状态下,要有智能提示,甚至某时错了,编译器帮忙查查错。上天去面试了,发现用笔写,不知道怎么下笔了。后来反思,应该还掌握的不够透吧,趁2012来临之际,把这个总结下,算是给自己有个交待,不会在末日的世界里糊里糊涂了。

 

1.delegate:

这个鸟玩意其实没有那么它听起来的那么重要,并不是每次遇到问题时候的第一选择。可是确实有些时候,为了代码的简约,它不失为一个很好的选项,甚至有些时候,它甚至是必须的选项,比如回调。。。。 

 

delegate是啥玩意,能用来干什么的? 这个现在我也不知道,小结嘛,都是通过很多个测试后总结出来的。(如果我能很流利、清晰的说出来,我也就不会写这个东西了)

先看个简单的例子:

 

 1using System.Text;

 2 using System.Threading;
 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.降低耦合。

 

 

 

posted on 2011-12-31 17:10  鹤翔九天  阅读(248)  评论(0)    收藏  举报

导航