在线等:C# .net委托 事件中,事件注册方法的问题

来源:百度知道 编辑:UC知道 时间:2024/06/27 17:53:52
事件注册第一个方法就用+=,注册第二个也是+=
为什么事件注册第一个方法不能直接用=?
委托注册第一个方法可以直接=,第二个开始才是+=
委托的例子:
delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
事件注册的例子:
heater.BoilEvent += alarm.MakeAlert; //注册方法
heater.BoilEvent += Display.ShowMsg; //注册静态方法
这个答案行么,Event事件出场了,它封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。

你在类的外面是不允许控制事件的注册委托的,假如允许=的话,那么就是说任何外部代码都可以使用任何事件替换已经注册好的事件,那样不就不安全了,这是一种保护措施,如果你在类内部的话是可以的。

回答补充:
我可以给你深入讲解一下.net的事件机制

实际上你看到的一个 public event MyDelegate MyEvent;
一个类型为MyDelegate的名字叫MyEvent的事件实际上在编译的时候会生成下面三个成员

第一个是一个MyDelegate类型的字段 就是一个引用字段 它可以存储一个委托
private MyDelegate MyEvent;
还有两个方法
public void add_MyEvent(MyDelegate value){ MyEvent += value; }; 用来向MyEvent的委托列表添加一个委托
public void remove_MyEvent(MyDelegate value){ MyEvent -= value; };同理是减少一个委托

我想你知道委托可以通过+=来附加多个委托,del2 += del1,那么最后del2会包含原来del2中的委托并在尾部追加del1委托形成一个委托列表,其实在编译的时候这个表达式其实调用了Delegate.Combine方法
我告诉你这个其实是想给你说,如果你类的外面注册一个事件的时候,如 obj1.MyEvent += myDel1,这时候编译的话其实是生成下面的代码obj1.add_MyEvent(myDel1);,我想这时候你会发现你其实不能直接操作MyEvent这个字段的,因为他是private的,所以为什么不能使用=进行赋值

上面只是原因,下面说说为什么这么做
比如现在有个情况,“老师”会有“下课”这个事件,那么班上很多同学都+=了这个事件,这时候(如果允许的话)你使用=注册了事件,那么这时候“老师”的“下课”事件中的委托仅仅只有你了,那么当老师引发下课事件的时候别的同学都收不到通知,这就叫破坏

希望我的解答你能满意

一个事件可以注册多个事件处理方法