C#事件

通过事件使用委托

事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(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函数中");
        }
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值