c#中事件Event声明和触发,以及自定义事件委托和系统委托EventHandler

时间:2022-12-01 21:34:08

c#中事件的声明和触发是通过定义的delegate委托类型来完成的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 事件1
{
    class Program
    {
        static void Main(string[] args)
        {
            myChangedEvent mce = new myChangedEvent();
            myEventListener mel = new myEventListener(mce);
            mce.ToString();
            mel.detach();
            mce.ToString();
        }
    }

    public delegate void myEventHandler(object s,EventArgs e);//声明自定义的事件委托,用来执行事件的声明,和处理方法的传递

    class myChangedEvent
    {
        public event myEventHandler Changed;//利用委托来声明事件
        protected virtual void OnChanged(EventArgs e)//声明事件触发的方法
        {
            if (Changed != null)
                Changed(this, e);//触发事件
        }

        public override string ToString()
        {
            OnChanged(EventArgs.Empty);//调用事件触发方法
            return "执行ToString";
        }
    }
    class myEventListener//声明事件监听的类型,并为以上声明事件传入处理方法
    {
        private myChangedEvent mce;
        public myEventListener(myChangedEvent Mce)
        {
           mce = Mce;//利用构造函数,获得对象的引用
           mce.Changed+=new myEventHandler(ListenerChanged);//为其事件添加自定义的处理方法
        }
        private void ListenerChanged(object s,EventArgs e)//声明一个符合事件委托签名的处理方法
        {
            Console.WriteLine("已经触发事件!");
        }
        public void detach()
        {
            mce.Changed -= new myEventHandler(ListenerChanged);
        }
    }
}

 

事件的声明过程

1.存在已经声明的事件委托,该委托位于namespace下,可全局访问

namespace 命名空间
{
  publice delegate void 事件委托(object sender,EventArgs e);
  
  class 类1{/*....*/}
  class 类2{/*....*/}
}

2.在数据类型中利用event和事件委托来声明事件,并声明事件触发方法

class 类1
{
      public event 事件委托类型 事件名称;
      protected virtual void 触发事件(EventArgs e)
        {
            if (事件名称 != null)
                事件名称(this, e);
        }
}

3.事件绑定,利用事件声明的对象实例,声明符合事件委托签名的方法,利用+=或-=来进行事件的绑定和解除

{
 
  类1 类1变量=new 类1();
  类1变量.事件名称+=new 事件委托类型(事件处理方法);
 
}

/*...*/

public void 事件处理方法(object sender,EventArgs e)
{
  /*处理过程*/
}

4.事件触发,代码利用事件声明中的触发事件的方法即可

 

注意:.Net提供自带的事件委托类型EventHandler(msdn:http://msdn.microsoft.com/zh-cn/library/system.eventhandler.aspx)

利用EventHandler,可以直接声明对象事件,免去自定义委托的声明

public event EventHandler 事件名称;