博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转载]C# 关键字Event
阅读量:7048 次
发布时间:2019-06-28

本文共 1735 字,大约阅读时间需要 5 分钟。

在委托实例前,不加event,那这个委托就是一个普通的委托,我们可以用别的函数调用,也可以直接用对象调用,但加上关键字之后,只能用成员函数调用 

  1. public delegate void MyButtonEventHandler(string msg);
  2. public class MyButton
  3. {
  4. public MyButtonEventHandler Click;
  5. private string msg;
  6. public void OnClick()
  7. {
  8. if (Click != null)
  9. {
  10. Click("我点击了:" + msg);
  11. }
  12. }
  13. //构造函数
  14. public MyButton(string msg)
  15. {
  16. this.msg = msg;
  17. }
  18. }
 
  1. MyButton mb = new MyButton("MyButton对象");
  2. //指定点击按钮后的处理方法
  3. mb.Click += MyButton_Click;
  4. mb.Click("Click为公共委托对象,可任意触发执行委托方法,而无需触发OnClick方法");
  5. //点击按钮触发委托方法
  6. //mb.OnClick();
  7. //响应处理方法
  8. private void MyButton_Click(string msg)
  9. {
  10. Response.Write(msg);
  11. }

 

使用event关键字:

  1. //定义一委托类型
  2. public delegate void MyButtonEventHandler(string msg);
  3. public class MyButton
  4. {
  5. //定义一委托实例(事件)
  6. public event MyButtonEventHandler Click;
  7. private string msg;
  8. ///
  9. /// 用于触发Click事件(模拟点击按钮)
  10. ///
  11. public void OnClick()
  12. {
  13. if (Click != null)
  14. {
  15. Click("我点击了:" + msg);
  16. }
  17. }
  18. //构造函数
  19. public MyButton(string msg)
  20. {
  21. this.msg = msg;
  22. }
  23. }

 

  1. MyButton mb = new MyButton("MyButton对象");
  2. mb.Click += MyButton_Click;
  3. //以下报错
  4. //mb.Click("Click为虽公共委托对象,但不可随意执行委托方法,因为有event关键字修饰!");
  5. //点击按钮后才触发委托方法(保证只有MyButton对象才可触发该事件)
  6. mb.OnClick();

 2》》》》》》》

delegate 委托

event 事件
事件是特殊的委托,是多播委托,可以添加多个事件处理函数,但是委托只能绑定一个处理函数。

c#中的delegate是Observe(观察者)设计模式的一种实现,以多播委托为底层支持,且是类型安全的。

event就是delegate的一种应用。加上event关键字的delegate能做的事,所谓纯的delegate也完全能做到。

如果你不想在声明delegate的类之外调用delegate,以及除了声明delegate的类,其它类只能订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)时就给delegate 对象的声明加个event关键字。

.net framework推荐使用了event关键字的delegate的原型最好类似delegate void MyEventHandler(object sender, MyEventHandler e);

 

事件模式推荐所有的事件处理程序的返回类型都为void,但并不强制。在Microsoft.NET Framework类库中有一些事件处理程序,例如ResolveEventHandler,就没有遵守Microsoft自己规定的模式,因为ResolveEventHandler事件处理程序返回一个类型为Assembly的对象。

转载于:https://www.cnblogs.com/yhlx125/articles/3186106.html

你可能感兴趣的文章
Codeforces Round #526 (Div. 1)
查看>>
博弈论笔记--06--纳什均衡之约会游戏与古诺模型
查看>>
Win10 资源管理器窗口无边框的问题
查看>>
[USACO 2.1.2]顺序的分数 (枚举+快排)
查看>>
Windows Live 2011 中英韩日版下载
查看>>
阅读《构建之法》十一、十二、十三章
查看>>
eval()解析JSON
查看>>
centos 安装使用 rar
查看>>
【C++】冒泡排序、插入排序、快速排序
查看>>
云计算,你必须知道云计算的硬件设施
查看>>
浅谈 Event Loop
查看>>
华硕手机平板PadFone配四核处理器
查看>>
Ext-js使用指南(总结)
查看>>
正则表达式的奥秘
查看>>
MySQL学习笔记
查看>>
CustomValidator 的应用
查看>>
Java基础问题10问
查看>>
SQL Serever学习6——数据表
查看>>
洛谷——P1462 通往奥格瑞玛的道路
查看>>
MySql的安装
查看>>