Fork me on GitHub

C#:Event

概念介绍

事件的定义

  事件:某些重要的发生的事情。
  角色:具备通知能力的类或对象。通知能力是事件发生的效果。
  使用:多个角色之间通过事件通知/响应进行信息传递。因此有效的事件都包含某些特定参数。C#将现实中的此类行为抽象为事件模型(Event Model)。

  事件行为与SomeIP的Service Discovery服务发现机制类似,都具备发布/订阅/处理的具体过程,您也可以按照SomeIP的SD机制间接理解。

事件模型的组成部分

  根据定义,将事件模型的组成的部分可以划分为5个:事件的拥有者、事件成员、事件的响应者、事件处理器、事件订阅。

  拥有者:Event Source,事件的产生方,事件不会主动发生,都是由拥有者内部逻辑触发的。
  成员:Event,主要有方法成员、属性成员。
  响应者:Event Subscriber,事件的响应方,产生方自身也可能是响应方。
  处理器:Event Handler,是响应者的一个方法成员,一般是一个委托实例或者具体方法名。
  订阅:Subscribe,事件发生的第一步。

  上面的成员概念不是很清楚的话,可以参考下图代码,在代码中会有更好的理解。注意:事件模型的五个成员可以有不同的组合方法。

  

事件的使用

  时间的使用我们一般都是使用事件的完全体:产生者+响应者+事件处理器+成员+订阅,但是五个组成也有不同的组成结构。

场景1:事件的产生者和响应者独立

查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;                            //事件的产生者定义

namespace Event2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Timer timer = new Timer();          //建立一个事件的产生者
            timer.Interval = 1000;              //产生者的属性成员

            Boy boy = new Boy();                //创建事件的响应者1
            Girl girl = new Girl();             //创建事件的响应者2

            timer.Elapsed += boy.Action;        //事件订阅1
            timer.Elapsed += girl.Action;       //事件订阅2

            timer.Start();                      //开始执行事件
            Console.ReadLine();
        }
    }


    class Boy                                   //事件的响应者1定义
    {
        internal void Action(object sender, ElapsedEventArgs e)//事件处理器
        {
            Console.WriteLine("Jump!");
        }
    }

    class Girl                                  //事件的响应者2定义
    {
        internal void Action(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("Sing!");
        }
    }
}

场景2:事件的产生者也是事件的响应者

查看代码
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;                     //事件的产生者定义

namespace Event2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Form form = new Form();                      //创建一个事件的产生者
            Controller controller = new Controller(form);//创建一个事件的响应者

            form.ShowDialog();
        }
    }


    class Controller//事件的响应者定义
    {
        private Form form;//事件的拥有者
        public Controller(Form form) 
        {
            if (form != null)
            { 
                this.form = form;
                this.form.Click += this.FormClicked;//事件订阅
            }
        }

        private void FormClicked(object sender, EventArgs e)//事件处理器
        {
            this.form.Text = DateTime.Now.ToString();
        }
    }
}

场景3:事件的响应者包含了事件的产生者

查看代码
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Event2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            MyForm myForm = new MyForm();
            myForm.ShowDialog();
        }
    }

    class MyForm:Form
    {
        private TextBox textbox;
        private Button button;//事件的拥有者是事件的响应者的一个成员
        public MyForm() //事件的响应者
        { 
            this.textbox = new TextBox();
            this.button = new Button();

            this.button.Top = 100;
            this.button.Width = 100;
            this.button.Height = 100;
            this.button.Text = "Button";

            this.Controls.Add(this.textbox);
            this.Controls.Add(this.button);

            this.button.Click += this.ButtonCliked;//事件订阅,事件的拥有者是Button
        }

        private void ButtonCliked(object sender, EventArgs e)//处理器
        {
            this.textbox.Text = "Hello,world!";
        }
    }
}

场景3:事件的继承使用

查看代码
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Event2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Myform myform = new Myform();
            myform.Click += myform.FormClick;
            myform.ShowDialog();
        }
    }

    class Myform : Form
    {
        internal void FormClick(object sender, EventArgs e)
        {
            this.Text = DateTime.Now.ToString();
        }
    }
}

 

posted @ 2023-10-02 18:12  张一默  阅读(16)  评论(0编辑  收藏  举报