今日看到一篇文章:

--------------------- 
作者:lulu_jiang 
来源:CSDN 
原文:https://blog.csdn.net/lulu_jiang/article/details/6451300

该文以实例分析了event关键字的作用,特此收录,并作进一步分析。

不使用event:

//定义一委托类型
public delegate void MyButtonEventHandler(string msg);//定义MyButton类,模拟按钮对象
public class MyButton
{//定义一委托实例public MyButtonEventHandler Click;private string msg;/// <summary>/// 用于触发Click事件(模拟点击按钮)/// </summary>public void OnClick(){if (Click != null){Click("我点击了:" + msg);}}//构造函数public MyButton(string msg){this.msg = msg;}
}MyButton mb = new MyButton("MyButton对象");
//指定点击按钮后的处理方法
mb.Click += MyButton_Click;/* * * * * * * * * * * * * * * * * * * * * * * *
注意:
作为一个按钮,本身正常的业务逻辑是:点击按钮后,执行响应处理方法
但由于mb.Click没有使用event关键字,只作为一公开普通委托实例对象
因此无需点击,就可任意执行处理方法,这显然不是我们所期望的^-^
* * * * * * * * * * * * * * * * * * * * * * * * */
mb.Click("Click为公共委托对象,可任意触发执行委托方法,而无需触发OnClick方法");
//点击按钮触发委托方法
//mb.OnClick();//响应处理方法
private void MyButton_Click(string msg)
{Response.Write(msg);
}

使用event:

//定义一委托类型
public delegate void MyButtonEventHandler(string msg);public class MyButton
{//定义一委托实例(事件)public event MyButtonEventHandler Click;private string msg;/// <summary>/// 用于触发Click事件(模拟点击按钮)/// </summary>public void OnClick(){if (Click != null){Click("我点击了:" + msg);}}//构造函数public MyButton(string msg){this.msg = msg;}
}MyButton mb = new MyButton("MyButton对象");
mb.Click += MyButton_Click;//以下报错
//mb.Click("Click为虽公共委托对象,但不可随意执行委托方法,因为有event关键字修饰!");//点击按钮后才触发委托方法(保证只有MyButton对象才可触发该事件)
mb.OnClick();

总结:

在定义委托时,前面加上event关键字,可以保证该委托不能在外部被随意触发,两者异同如下表所示:

  注册 注销 内部触发 外部触发
delegate += -= Invoke Invoke
event delegate += -= Invoke 不允许

所以,event关键字有助于提高类的封装性,物理隔绝代码耦合,迫使类设计更追求高内聚。对于架构师是把利器,但是大部分编码人员最讨厌这类限制他们编码自由度的工具,恨不得一切都是public的,随便调用。架构师的日子可不太好过。

C# event关键字相关推荐

  1. C#语法之event关键字

    event 关键字用于在发行者类中声明事件. 下面的示例演示如何声明和引发将 EventHandler 用作基础委托类型的事件. public class Publisher { // Declare ...

  2. C# 关键字Event

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

  3. Event日志关键字:EventLogTags.logtags

    Event日志关键字:EventLogTags.logtags 语法定义:system/core/logcat/event.logtags 查看Event所有的tags:adb shell cat / ...

  4. [C#] Delegate, Multicase delegate, Event

    声明:这篇博客翻译自:https://www.codeproject.com/Articles/1061085/Delegates-Multicast-delegates-and-Events-in- ...

  5. C#中Delegate和Event以及它们的区别(转载)

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  6. C# delegate event

    最近一直在学习C#的Delegate机制,总结在这里,以供大家参考. 参考资料: http://www.akadia.com/services/dotnet_delegates_and_events. ...

  7. C#事件(Event)的理解

    文章目录 C#事件(Event)的理解 **事件的定义:** 事件的类型 C#事件(Event)的理解 事件的定义: C# 事件(Event): 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或 ...

  8. C# 委托(Delegate) 事件(Event)应用详解

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...

  9. delegate和event(转载too)

    从 前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺.但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的 工作进度,以防止他偷懒.但是彼得又不想让老板呆在他 ...

最新文章

  1. 又改ResNet | 重新思考ResNet:采用高阶方案的改进堆叠策略(附论文下载)
  2. 原子操作之sync/atomic
  3. 海洋分享lol皮肤插件_LOL手游:能否火起来,梦泪测试后给出评价,网友:说的太真实了...
  4. java list 移除_java 中List删除实例详解
  5. Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
  6. Kafka解惑之Old Producer(3)——Async Analysis
  7. 五种类型的程序员,你属于哪一种?
  8. android 画布控件,Android canvas画图操作之切割画布实现方法(clipRect)
  9. Jenkins 入门系列--jenkins 介绍
  10. 1.5 编程基础之循环控制 29 数字反转
  11. 格力回应被中国移动取消中标资格:系投标人员整理材料失误
  12. python 求 gamma 分布_python如何生成各种随机分布图
  13. win10系统 安装modelsim64位的无法生成license文件的解决办法
  14. java中将zip文件解压到指定目录下
  15. 二十年经典港台电视剧回顾
  16. ISO26262道路车辆功能安全标准-(1)适用范围
  17. 社会工程学之从微信取名看性格
  18. html 登录页面模板
  19. html中repeat的作用,html中hover和no-repeat
  20. 京东和区块链的那些事儿

热门文章

  1. 代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和
  2. oracle tns12535,TNS-12535 TNS-00505的处理方法
  3. Android开发之Toolbar(实现自定义工具栏)
  4. 关于IP协议首部长度的计算
  5. python 导入magenta失败,报AttributeError错误解决办法
  6. 我的世界服务器自动跳跃,《我的世界》学会2条跳跃指令 加速度超越火箭 轻轻一跳越过256...
  7. golang 实践配合 php 进行 web 开发,golang 适合做web开发吗
  8. 一个 Intel(R) Wi-Fi 6E AX210 160MHz 叹号解决
  9. 根据配送日期,计算到货时间 (客制化自用)
  10. LM小型可编程控制器软件(基于CoDeSys)笔记二十:plc通过驱动器控制步进电机