C#中事件是基于委托。
不使用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();