通过事件使用委托
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。
发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。
订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。
实例1
using System;
namespace SimpleEvent
{
using System;
/***********发布器类***********/
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.SetValue( 7 );
e.SetValue( 11 );
}
}
}
实例2
class DelegateTest // 发布器类
{
public delegate void delegate_tz();
public event delegate_tz delegate_tz0;
public static void get()
{
Console.WriteLine("这是触发事件的第一个方法,此方法在事件类中");
}
public void inter()
{
Console.WriteLine("开始调用事件方法");
delegate_tz0();
}
}
class Test // 订阅器类
{
public Test()
{ }
public void TryEvent()
{
Console.WriteLine("这是触发事件的第三个方法,在订阅器中,这才是正宗的订阅器类");
Console.ReadKey();
}
}
class Program //主体函数 程序入口
{
static void Main(string[] args)
{
DelegateTest DelegateTest0 = new DelegateTest();
//主体函数中根据需求组装事件,组装过程类似委托多播
DelegateTest0.delegate_tz0 += new DelegateTest.delegate_tz(DelegateTest.get);
DelegateTest0.delegate_tz0 += new DelegateTest.delegate_tz(Method1);
DelegateTest0.delegate_tz0 += new DelegateTest.delegate_tz(new Test().TryEvent);
DelegateTest0.inter(); // 执行操作,以触发事件
}
static public void Method1()
{
Console.WriteLine("这是触发事件的第二个方法,在主体Main函数中");
}
}