C# 事件的简单理解
2016-03-30 15:30
387 查看
引用书中的一段话:
事件基于委托。为委托提供了一种发布订阅机制.
从这句话来看,首先要有委托,然后有事件,发布事件,接着订阅事件.
第一部分:最简单的例子
看第一个例子:
这里需要注意的有:
1:定义delegate对象时要有两个参数object sender 和 System.EventArgs e
2:定义事件时,事件类型要跟委托类型相同
3:事件体中事件处理方法要跟delegate对象有相同的参数和返回值
4:事件触发的方式是 事件名(参数1,参数2)
5:订阅消息时用+=,取消的时候用 -=
第二部分:对于上一个例子,订阅消息是在调用的时候添加到队列的,也可以在构造函数中进行添加。
如:
第三部分:delegate的第二个参数,可以自己定义
这里要注意:
定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
第四部分:两个类中
事件基于委托。为委托提供了一种发布订阅机制.
从这句话来看,首先要有委托,然后有事件,发布事件,接着订阅事件.
第一部分:最简单的例子
看第一个例子:
class Program { static void Main(string[] args) { Event1 e1 = new Event1(); e1.EventHandle += e1.SayEvent2; //订阅了消息 e1.SayEvent1(); Console.ReadKey(); } } public delegate void MyEventHandle(object sender,System.EventArgs e);//(1)定义委托 public class Event1 { public event MyEventHandle EventHandle;//(2)定义事件 public void SayEvent2(object sender,System.EventArgs e) (3)事件体 { if (EventHandle != null) { Console.WriteLine("我需要触发!"); } } public void SayEvent1() //触发SayEvent2 { Console.WriteLine("我不需要触发!"); EventHandle(this,new EventArgs()); } }
这里需要注意的有:
1:定义delegate对象时要有两个参数object sender 和 System.EventArgs e
2:定义事件时,事件类型要跟委托类型相同
3:事件体中事件处理方法要跟delegate对象有相同的参数和返回值
4:事件触发的方式是 事件名(参数1,参数2)
5:订阅消息时用+=,取消的时候用 -=
第二部分:对于上一个例子,订阅消息是在调用的时候添加到队列的,也可以在构造函数中进行添加。
如:
class Program { static void Main(string[] args) { Event1 e1 = new Event1(); //e1.EventHandle += e1.SayEvent2; e1.SayEvent1(); Console.ReadKey(); } } public delegate void MyEventHandle(object sender,System.EventArgs e); public class Event1 { public Event1()//我是构造函数,添加事件到队列中 { this.EventHandle += new MyEventHandle(SayEvent2); } public event MyEventHandle EventHandle; public void SayEvent2(object sender,System.EventArgs e) { if (EventHandle != null) { Console.WriteLine("我需要触发!"); } } public void SayEvent1() { Console.WriteLine("我不需要触发!"); EventHandle(this,new EventArgs()); } }
第三部分:delegate的第二个参数,可以自己定义
class Program { static void Main(string[] args) { Event1 e1 = new Event1(); //e1.EventHandle += e1.SayEvent2; e1.SayEvent1("jazz"); Console.ReadKey(); } } public class myEvent : EventArgs { public string _name; public myEvent(string name) { this._name = name; } } public delegate void MyEventHandle(object sender, myEvent e); public class Event1 { public Event1() { this.EventHandle += new MyEventHandle(SayEvent2); } public event MyEventHandle EventHandle; public void SayEvent2(object sender, myEvent e) { if (EventHandle != null) { Console.WriteLine("我需要触发!"); } } public void SayEvent1(string name) { Console.WriteLine("我不需要触发!"); EventHandle(this, new myEvent(name)); } }
这里要注意:
定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
第四部分:两个类中
class Program { static void Main(string[] args) { Event1 e1 = new Event1(); Event2 e2 = new Event2(); //e1.EventHandle += e1.SayEvent2; e1.EventHandle += e2.SayEvent3; //添加事件到消息队列 e1.SayEvent1("jazz"); Console.ReadKey(); } } public class myEvent : EventArgs { public string _name; public myEvent(string name) { this._name = name; } } public delegate void MyEventHandle(object sender, myEvent e); public class Event1 { public Event1() { this.EventHandle += new MyEventHandle(SayEvent2); } public event MyEventHandle EventHandle; public void SayEvent2(object sender, myEvent e) { if (EventHandle != null) { Console.WriteLine("我需要触发!"); } } public void SayEvent1(string name) { Console.WriteLine("我不需要触发!"); EventHandle(this, new myEvent(name)); } } public class Event2 { public void SayEvent3(object sender, myEvent e) { Console.WriteLine("我需要触123456!"); } }
相关文章推荐
- 下载百度上的图片C#——输入名字就可以下载
- C# 调用Excel 出现服务器出现意外情况. (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)
- C#委托的介绍(delegate、Action、Func、predicate)
- C# Action<T> 委托
- C# 发送邮件方法2
- c#主窗体向子窗体上的报表传参数
- C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍(转)
- Gmap.net百度地图开发
- C# 发送邮件方法
- 详解C#利用DataTable导出Excel
- 关于C#的Equals和Contains方法
- C# 去除字符串首尾字符或字符串
- C#中的强制类型转换与as转换的区别
- C#序列化及反序列化:类实例和string类型之间转换
- C#中的委托(Delegate)和事件(Event)
- C#中的泛型
- C#中的数组作为参数传递所引发的问题
- C# 委托 多线程
- c# 多态
- C#dynamic关键字(1)