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类的外面以赋值的方式访问。