首页 > 代码库 > 有关C#事件总结
有关C#事件总结
事件(发布者)发送者和事件接收者(订阅者)
第一步:发送者类定义事件成员
第二步:在接收者类定义触发事件的方法
事件接收者(事件发生时得到通知 的类)
第三步:当发送者触发事件时,该事件的方法列表所有处理程序都会被调用。
注意:
事件处理程序:由订阅者注册到事件的方法,在发布者触发事件时产生。通常事件处理程序方法可以定义在事件所在的类中,也可以定义在不同的类。
使用事件时的5个源代码组件
组件说明:
委托类型声明
事件和事件处理程序必须有共同的签名和返回类型,通过委托类型描述
事件处理程序声明
订阅者类中会在事件触发式执行的方法声明。
事件声明
声明事件为public
事件注册
订阅者必须订阅事件才能在它触发时得到通知。
触发事件的代码
发布者类中“触发”事件并导致调用注册的所有事件处理程序的代码。
声明事件
发布者类必须提供事件对象。
声明事件注意如下几点
事件声明在一个类中
需要委托类型的名称,任何附加到事件(如注册)的处理程序都必须与委托类型的签名和返回类型匹配。
事件必须声明为public,这样其他类可以在它上面附加(注册)事件处理程序。
不能使用对象创建表达式(new 表达式)来创建它的对象。
事件是类的成员,还有事件声明需要委托类型的名字,可以声明一个委托类型。
如:public delegate void MyDeleGate(); //声明委托
class Send
{
public event MyDeleGate eventMyDele; //声明委托类型事件
public void OneventMyDele() // 触发事件的代码的方法
{
if(eventMyDele!=null) //触发事件之前和null进行比较,查看是否含有注册的事件处理程序,如果事件是null,则没有注册程序,不能执行。(确认有方法可以执行)
eventMyDele(); //触发事件 跟调用方法一样。
} }
class Accept1
{
public Accept1(Send s)
{ s.eventMyDele += newMyDeleGate(s_eventMyDele); }
//使用+=运算符为事件增加事件处理程序。事件处理程序位于该运算符的右边。
public void s_eventMyDele()
{
Console.WriteLine("hello") ;
}
}
class Accept2
{
public Accept2(Send send)
{
send.eventMyDele += newMyDeleGate(send_eventMyDele);
//使用+=运算符为事件增加事件处理程序。事件处理程序位于该运算符的右边。
}
void send_eventMyDele()
{
Console.WriteLine("world");
}
}
class Program
{
static void Main(string[] args)
{
Send s = new Send();
Accept1 ac1 = new Accept1(s);
Accept2 ac2 = new Accept2(s);
s.OneventMyDele();
Console.ReadKey(true);
}
}
}
标准事件的用法
Windows应用程序是基于事件驱动的 ,在程序运行时,它可以在任何时候被事件打断。对于事件的使用,.NET框架提供了一个标准模式。
事件使用的标准模式根本就是System命名空间声明的EventHandle委托类型。
public delegate void EventHandler(object sender, EventArgs e);
注意:
EventHandler委托类型的第二个参数是EventArgs类的对象,它声明在System命名空间中。
EventArgs设计为不能传递任何数据。(是个空类,没有成员)
用于不需要传递数据的事件处理程序。
object, EventArgs 是基类,这样EventHandler能提供一个对所有事件和事件处理程序都通用签名。
把上面程序改用标准事件
//public delegate void MyDeleGate();
class Send
{ public event EventHandler eventMyDele;
public void OneventMyDele()
{ if(eventMyDele!=null)
eventMyDele(this,null); //有两个参数
}
}
class Accept1
{ public Accept1(Send s)
{ s.eventMyDele += new EventHandler(s_eventMyDele);}
public void s_eventMyDele(object sender,EventArgs e) //要加上object sender,EventArgs e
{ Console.WriteLine ("hello") }
}
class Accept2
{ public Accept2(Send send)
{ send.eventMyDele += new EventHandler(send_eventMyDele);
}
void send_eventMyDele(object sender,EventArgs e)
{ Console.WriteLine("world"); }
}
class Program
{
static void Main(string[] args)
{ Send s = new Send();
Accept1 ac1 = new Accept1(s);
Accept2 ac2 = new Accept2(s);
s.OneventMyDele();
Console.ReadKey(true);
} }
}
通过扩展EventArgs来传递数据
为了向自己事件处理程序的第二个参数传入数据,并且又符合标准惯例,需要声明一个派生自EventArgs的自定义类,它可以保存我们需要传入的数据。以上题为例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class SendEventArgs : EventArgs
{
public string message
{
get;private set;
}
public SendEventArgs(string m)
{
this.message = m;
}
}
class Send
{
public event EventHandler<SendEventArgs>eventMyDele;
public void OneventMyDele() //在事件触发代码,给自定义事件参数类传递数据
{
SendEventArgs sed = newSendEventArgs("C# Study");
if(eventMyDele!=null)
eventMyDele(this ,sed); //有两个参数
}
}
class Accept1
{
public Accept1(Send s)
{ s.eventMyDele += new EventHandler<SendEventArgs>(s_eventMyDele);}
public void s_eventMyDele(object sender, SendEventArgse) //要加上objectsender, EventArgs e
{
Console.Write("hello") ;
}
}
class Accept2
{
public Accept2(Send send)
{
send.eventMyDele += newEventHandler<SendEventArgs>(send_eventMyDele);
}
void send_eventMyDele(object sender, SendEventArgse)
{
Console.WriteLine("world"+e.message );
}
}
class Program
{
static void Main(string[] args)
{
Send s = new Send();
Accept1 ac1 = new Accept1(s);
Accept2 ac2 = new Accept2(s);
s.OneventMyDele();
Console.ReadKey(true);
}
}
}
有关C#事件总结