代码改变世界

C# 事件

2020-10-20 17:01  石吴玉  阅读(102)  评论(0编辑  收藏  举报

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。

C# 中使用事件机制实现线程间的通信。

事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。

发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。

订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。

代码Demo

namespace TestCore
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //实例化对象,第一次没有触发事件
            EventTest e = new EventTest();
            //实例化接收器对象
            SubscriEvent v = new SubscriEvent();
            //注册事件
            e.ChangeNum += new EventTest.NumManipulationHandler(v.printf);
            e.ChangeNum += new EventTest.NumManipulationHandler(v.printN);
            e.SetValue(7);
            e.SetValue(11);
            Console.WriteLine("hello word");
        }
    }

    //发布器类
    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");
            }
        }

        public EventTest()
        {
            int n = 5;
            SetValue(n);
        }

        public void SetValue(int n)
        {
            if (value != n)
            {
                value = n;
                OnNumChanged();
            }
        }
    }

    //订阅器类
    public class SubscriEvent
    {
        public void printf()
        {
            Console.WriteLine("event fire");
        }
        public void printN()
        {
            Console.WriteLine("事件执行了");
        }
    }
}
View Code

执行结果: