C# .net委托 事件中,事件注册方法的问题
2009-09-01 09:09
387 查看
事件注册第一个方法就用+=,注册第二个也是+=为什么事件注册第一个方法不能直接用=?委托注册第一个方法可以直接=,第二个开始才是+=委托的例子: delegate1 = EnglishGreeting; // 先给委托类型的变量赋值 delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法事件注册的例子: heater.BoilEvent += alarm.MakeAlert; //注册方法 heater.BoilEvent += Display.ShowMsg; //注册静态方法
你在类的外面是不允许控制事件的注册委托的,假如允许=的话,那么就是说任何外部代码都可以使用任何事件替换已经注册好的事件,那样不就不安全了,这是一种保护措施,如果你在类内部的话是可以的。
回答补充:
我可以给你深入讲解一下.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的,所以为什么不能使用=进行赋值
上面只是原因,下面说说为什么这么做
比如现在有个情况,“老师”会有“下课”这个事件,那么班上很多同学都+=了这个事件,这时候(如果允许的话)你使用=注册了事件,那么这时候“老师”的“下课”事件中的委托仅仅只有你了,那么当老师引发下课事件的时候别的同学都收不到通知,这就叫破坏
委托的用法很多:一般是用于声明事件和回调的委托,还可以是用于代表方法标签的委托.至于用法你可以在MSDN上找.
以下是我个人的看法:
1)有了委托你就可以把方法看作像常数一样,而委托就是该常数类型的变量.
从这个角度看来用于声明事件的委托就是声明这个事件触发以后所调用的方法的标签或者特征.只有符合该标签(参数个数和参数类型)的方法才可以做为该用于该事件的回调.
一个事件触发了,你可能需要用多个方法处理该事件或者说该事件调用了多个方法(每个事件的实例都有一个需要调用的方法列表,当事件触发它会逐个调用列表中的每个方法)
2)通过使用委托你可以实现对方法变化的封装.
打个比方:如果你骑自行车,你需要有骑自行车的方法DriveBike().如果你骑摩托车你需要有骑摩托车的方法.现在你有一个方法DriveMoto.现在你需要定义一个方法,实现你骑(自行车或者摩托车)到某地DriveTo(地点,骑的方式)
骑的方式这里其实就是委托.在使用的时候,如果你是骑自行车你就用DriveBike实例化委托的实例带入DriveTo方法,如果你骑摩托车你就用DriveMoto实例化"骑的方式"这个委托带入DriveTo方法.
类别:c# 委托 查看评论
你在类的外面是不允许控制事件的注册委托的,假如允许=的话,那么就是说任何外部代码都可以使用任何事件替换已经注册好的事件,那样不就不安全了,这是一种保护措施,如果你在类内部的话是可以的。
回答补充:
我可以给你深入讲解一下.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的,所以为什么不能使用=进行赋值
上面只是原因,下面说说为什么这么做
比如现在有个情况,“老师”会有“下课”这个事件,那么班上很多同学都+=了这个事件,这时候(如果允许的话)你使用=注册了事件,那么这时候“老师”的“下课”事件中的委托仅仅只有你了,那么当老师引发下课事件的时候别的同学都收不到通知,这就叫破坏
委托的用法很多:一般是用于声明事件和回调的委托,还可以是用于代表方法标签的委托.至于用法你可以在MSDN上找.
以下是我个人的看法:
1)有了委托你就可以把方法看作像常数一样,而委托就是该常数类型的变量.
从这个角度看来用于声明事件的委托就是声明这个事件触发以后所调用的方法的标签或者特征.只有符合该标签(参数个数和参数类型)的方法才可以做为该用于该事件的回调.
一个事件触发了,你可能需要用多个方法处理该事件或者说该事件调用了多个方法(每个事件的实例都有一个需要调用的方法列表,当事件触发它会逐个调用列表中的每个方法)
2)通过使用委托你可以实现对方法变化的封装.
打个比方:如果你骑自行车,你需要有骑自行车的方法DriveBike().如果你骑摩托车你需要有骑摩托车的方法.现在你有一个方法DriveMoto.现在你需要定义一个方法,实现你骑(自行车或者摩托车)到某地DriveTo(地点,骑的方式)
骑的方式这里其实就是委托.在使用的时候,如果你是骑自行车你就用DriveBike实例化委托的实例带入DriveTo方法,如果你骑摩托车你就用DriveMoto实例化"骑的方式"这个委托带入DriveTo方法.
类别:c# 委托 查看评论
相关文章推荐
- 关于C#.Net中事件(event)、委托(delegate)和方法的一点理解
- C# 中的委托和事件+匿名方法函数
- C#中的委托和事件—1.将方法作为方法的参数
- C#中的方法(函数),委托和事件
- c#如何取得事件注册的方法
- C#基础:委托、匿名方法、事件
- c#中转出Excel时碰到Excel的COM组件没有注册的问题解决方法
- 关于C#/.NET中委托和事件的机制和应用的故事(转)
- C#基础精华07(委托事件,委托的使用,匿名方法)
- C#用ado.net访问EXCEL的常见问题及解决方法
- C# 中的委托和事件——http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
- 14 C# 第十三章 事件和委托(一) 多播委托的问题
- c#.NET的事件与委托例子
- C#.Net中解决PictureBox控件用FormFile方法后文件被锁定的问题
- ASP.NET(C#) 读取EXCEL另加解决日期问题的方法分享
- C#.NET常见问题(FAQ)-如何捕捉窗体关闭的事件,弹窗确认是否退出
- C#解惑2——Delegate,Action,Func,匿名方法,匿名委托,事件(转)
- 一个事半功倍的c#方法 动态注册按钮事件
- C#中的委托和事件--2.将方法绑定到委托
- C# 委托事件的另类取消方法