C#委托和事件详解(7)

来源:百度文库 编辑:神马文学网 时间:2024/05/23 14:51:51

尽管这样达到了我们要的效果,但是似乎并不美气,光是第一个方法注册用“=”,第二个用“+=”就让人觉得别扭。此时,轮到Event出场了,C# 中可以使用事件来专门完成这项工作,我们改写GreetingManager类,它变成了这个样子:

以下是引用片段:
   publicclassGreetingManager{
   //这一次我们在这里声明一个事件
   publiceventGreetingDelegateMakeGreet;
   publicvoidGreetPeople(stringname,GreetingDelegateMakeGreeting){
   MakeGreeting(name);
   }
   }

很容易注意到:MakeGreet 事件的声明与之前委托变量delegate1的声明唯一的区别是多了一个event关键字。看到这里,你差不多明白到:事件其实没什么不好理解的,声明一个事件不过类似于声明一个委托类型的变量而已。

我们想当然地改写Main方法:

以下是引用片段:
   staticvoidMain(string[]args){
   GreetingManagergm=newGreetingManager();
   gm.MakeGreet=EnglishGreeting;//编译错误1
   gm.MakeGreet+=ChineseGreeting;
   gm.GreetPeople("JimmyZhang",gm.MakeGreet);//编译错误2
   }

这次,你会得到编译错误:事件“Delegate.GreetingManager.MakeGreet”只能出现在 += 或 -= 的左边(从类型“Delegate.GreetingManager”中使用时除外)。

事件和委托的编译代码

这时候,我们不得不注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误:

public event GreetingDelegate MakeGreet;

可以看到,实际上尽管我们在GreetingManager里将 MakeGreet 声明为public,但是,实际上MakeGreet会被编译成 私有字段,难怪会发生上面的编译错误了,因为它根本就不允许在GreetingManager类的外面以赋值的方式访问。