C#事件自我理解

来源:互联网 发布:益盟按部就班指标源码 编辑:程序博客网 时间:2024/05/17 22:09

上图是使用事件的5个源代码组件。
(1)事件里包含了一个私有委托。即委托类型声明。
如果没有显示声明的话,委托使用的是System命名空间中的EventHandler标准事件委托:
public delegate void EventHandler(object obj,EventArgs args);
其中EventArgs类型参数被设计为不能传递任何数据。如果希望传递数据的话,必须声明一个从EventArgs继承的类,然后显示声明一个委托类型:
    //自定义EventArgs参数(可以接收参数)
    public class MyEventArgs : EventArgs
    {
        public string Message = "";
        public MyEventArgs(string message)
        {
            Message = message;
        }
    }
    public delegate void MyEventHandler(object obj,MyEventArgs args);
(2)发布者类
包含事件声明:
public event EventHandler Elapsed;
和外界事件调用方式
(3)订阅者类
主要是 需要注册到事件上的时间处理程序。
(4)事件注册
将订阅者类中的程序注册到发布者类中的事件

完整简单事件代码如下所示:
    //自定义EventArgs参数(可以接收参数)
    public class MyEventArgs : EventArgs
    {
        public string Message = "";
        public MyEventArgs(string message)
        {
            Message = message;
        }
    }
    //自定义委托类型声明(如果不是自定义,则使用系统已经拥有的EventHandler
    public delegate void MyEventHandler(object obj,MyEventArgs args);
    //事件发布者publisher
    public class MyTimerClass
    {
       //声明事件(两种方式)
        public event EventHandler<MyEventArgs> Elapsed;//使用泛型
        //public event MyEventHandler Elapsed;//自定义一个MyEventHandler委托
        //事件调用
        private void OnOneSecond(object obj,EventArgs args)
        {
            MyEventArgs args1 = new MyEventArgs("Message From OnOneSecond");
            if (Elapsed != null)
            {
                Elapsed(obj, args1);
            }
        }
        //private System.Timers.Timer MyPrivateTimer;
        public MyTimerClass()
        {
            //创建一个私有定时器
            System.Timers.Timer MyPrivateTimer = new System.Timers.Timer();
            //给私有定时器注册事件
            MyPrivateTimer.Elapsed += OnOneSecond;
            MyPrivateTimer.Interval = 1000;
            MyPrivateTimer.Enabled = true;
        }
    }
    //事件处理程序(订阅者)
    public class ClassA
    {
        public void TimerHandlerA(object obj,MyEventArgs args)
        {
            Console.WriteLine("ClassA receive Message:{0}",args.Message);
        }
    }
    public class ClassB
    {
        public static void TimerHandlerB(object obj,MyEventArgs args)
        {
            Console.WriteLine("ClassB receive Message:{0}", args.Message);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //发布者实例化
            MyTimerClass time = new MyTimerClass();
            //订阅者实例化
            ClassA a = new ClassA();
            //事件注册
            time.Elapsed += a.TimerHandlerA;
            time.Elapsed += ClassB.TimerHandlerB;
            //事件调用
            Thread.Sleep(3250);
        
        }
    }
0 0