今日看到一篇文章:
---------------------
作者: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的,随便调用。架构师的日子可不太好过。