事件的那些事儿
事件说白了就是委托,一种特殊的委托。
事件我们可以理解成:消费者向服务者提出服务的方式,然后服务者根据消费者提出的方式去执行服务,比如餐馆与食客。
建立事件的要素:
1.声明一个委托(饭店经营的执照):
public delegate void myDelegate(Custom sender);
2.定义一个提供事件服务的类,里面包含了事件的定义、调用事件执行的方法,当然也可以包含事件委托。
2.1声明一个改委托类型的事件(饭店里的厨子):
public event myDelegate myEvent;
2.2 定义事件执行的方法(厨子做饭)
public void Run(object sender) { myServer(sender); }
3.定义一个使用时间的消费者类,里面包含了 将事件和消费事件方法绑定、消费事件方法的定义
3.1 自身的事件方法和服务类事件挂钩(厨子和执照的对应,没有执照不让开厨子做生意):
public void Customer(Server se) { se.myServer+=new Server.myDelegate(this.myCus); }
3.2消费事件方法(客人提出自己想吃什么,这饭怎么做)
public void myCus(object cs) { Console.WriteLine(cs.ToString()+"是消费事件方法"); }
4主函数中对事件本身触发的使用(主函数相当于饭馆的饭桌):
4.1调用Customer方法(客人来了提出自己想吃什么)
4.2.调用服务类事件执行方法(厨师去按照客人的吩咐做饭)
总览:
class Server { public delegate void myDelegate(object sender); public event myDelegate myServer; public void Run(object sender) { myServer(sender); } } class Custom { public void Customer(Server se) { se.myServer+=new Server.myDelegate(this.myCus); } public void myCus(object cs) { Console.WriteLine(cs.ToString()+"是消费事件方法"); } } public class Event { static void Main() { Server server = new Server(); Customer cs = new Customer(); cs.Customer(server); server.Run(new Event()); Console.ReadKey(); } }
一些扩展:
1.在以上的代码中的
server.Run(new Event())
new Event() 这个参数可以变换,因为当初设定服务类中事件运行方法和委托的时候参数是 object类型,所以这里可以是各种对象。这就使委托变得形式多样化。
2.声明委托的时候,也可以独立在类之外,但是参数类型就只能是object,而不是前面提到的Custom,因为委托面向的范围层级不一样。限定具体类类型的委托需包含于类中。看代码:
namespace Test { public delegate void myDelegate(object sender); class Server { public event myDelegate myServer; public void run(object sender) { myServer(sender); } } class Custom { public void myCus(object cs) { Console.WriteLine(cs.ToString()+"什么"); } } public class Event { static void Main() { Server server = new Server(); server.myServer += new myDelegate(new Custom().myCus); Custom sc = new Custom(); server.run(sc); Console.ReadKey(); } static void server_myServer(object sender) { Console.WriteLine(sender.ToString()); Console.WriteLine(123); } } }