事件(Event)
一个用户的操作,或者说是触发事件,按钮的点击,鼠标的移动,设备的命令等。应用程序需要在事件发生时相应事件。如,中断。
c#中使用事件机制来实现线程间的通讯。
通过事件使用委托
事件在类中声明且生成,通过使用同一个类或其他类中的委托与事件处理程序相关联。
包含事件的类用于发布事件,称之为发布器(publisher)
接受该事件的类称之为 订阅器(subscriber)
事件使用 发布-订阅(publisher-subscriber) 模型。
发布器(publisher),是一个包含事件与委托定义的对象,事件和委托之间的联系也定义在这个对象中,发布器中的对象调用这个事件,并通知其他对象。
订阅器(subscriber),是一个接受事件并提供事件处理程序的对象,在发布器类中的委托调用订阅器类中的方法(事件处理程序)
声明事件(Event)
在类的内部声明事件,首先必须声明该事件的委托类型:
public delegate void myDelegateHandler(string s);
然后声明事件的本身,使用Event关键字
public event myDelegateHandler myDelegateEvent;
实例:
namespace ttest
{
/***********发布器类***********/
public class EventTest
{
private int value;
public delegate void NumManipulationHandler();
public event NumManipulationHandler ChangeNum;
protected virtual void OnNumChanged()
{
if (ChangeNum != null)
{
ChangeNum(); /* 事件被触发 */
}
else
{
Console.WriteLine("event not fire");
Console.ReadKey(); /* 回车继续 */
}
}
public EventTest()
{
int n = 5;
SetValue(n);
}
public void SetValue(int n)
{
if (value != n)
{
value = n;
OnNumChanged();
}
}
}
/***********订阅器类***********/
public class subscribEvent
{
public void printf()
{
Console.WriteLine("event fire");
Console.ReadKey(); /* 回车继续 */
}
}
/***********触发***********/
public class MainClass
{
public static void Main()
{
EventTest e = new EventTest(); /* 实例化对象,第一次没有触发事件 */
subscribEvent v = new subscribEvent(); /* 实例化对象 */
e.ChangeNum += new EventTest.NumManipulationHandler(v.printf); /* 注册 */
//e.ChangeNum += v.printf; /* 注册 */
//e.ChangeNum += E_ChangeNum; /* 注册 */
e.SetValue(7);
e.SetValue(11);
}
private static void E_ChangeNum()
{
Console.WriteLine("hello world!");
//throw new NotImplementedException();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
event not fire
event fire
event fire
实例2:
namespace ttest
{
/***********发布器类***********/
class Dog
{
private String name;
private String color;
public delegate void Handeler(string name,string color); //定义委托
public static event Handeler NewDog; //定义事件
public Dog(String Name, String Color)
{
name = Name;
color = Color;
if (NewDog != null)
{
Console.WriteLine("新进了一只狗 name:"+name+" color:"+color);
NewDog(name,color); //调用事件
}
}
}
class Test
{
public static void Main(String[] args)
{
Dog d = new Dog("Tony", "yellow"); //因为还没有添加订阅,所以不能触发事件
Dog.NewDog += new Dog.Handeler(Client1); //Client1添加订阅
Dog.NewDog += new Dog.Handeler(Client2);//Client2添加订阅
Dog d2 = new Dog("Tom", "white");
Console.ReadKey();
}
static void Client1(string name, string color)
{
Console.WriteLine("我喜欢"+name+"这条狗!");
}
static void Client2(string name, string color)
{
Console.WriteLine("我非常想要"+name+"!");
}
}
}
结果:
第二个例子中,周游NewDog被订阅了才会触发