C#入门详解(11)

事件的应用

实例演示

派生与拓展

事件模型的五个组成部分

1,事件的拥有者(event source,对象)

2,事件成员(event,成员)

3,事件的响应者(event subscriber,对象)

4,事件处理器(event handler,成员)-----本质上是一个回调方法

5,事件回调------把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的约定

注意

事件处理器是成员方法

挂接事件处理器的时候,可以使用委托类型,也可以直接使用方法名,这是个语法糖

事件处理器对事件的订阅不是随意的,匹配与否由声明事件时所使用的委托类型来检测

事件可以同步调用也可以异步调用

事件的各种模型

事件的拥有者 订阅 事件的响应者

 class Program
    {
        static void Main(string[] args)
        {
            System.Timers.Timer timer = new System.Timers.Timer();//事件的拥有者

            timer.Interval = 1000;

            Boy boy = new Boy();//事件的响应者

            //Elapsed为事件 Action为事件处理器
            timer.Elapsed += boy.Action;//订阅操作

            timer.Start();
        }   
    }

    class Boy
    {
        internal void Action(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("Jump");
        }
    }

事件的拥有者和事件响应者不相同

  static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
            Form form = new Form();
            Controller control = new Controller(form);
            form.ShowDialog();
        }
    }
    public class Controller
    {
        private Form form;

        public Controller(Form form)
        {
            if (form!=null)
            {
                this.form = form;
                this.form.Click += this.ShowTime;
            }
        }

        private void ShowTime(object sender, EventArgs e)
        {
            this.form.Text = DateTime.UtcNow.ToString();
        }
    }

事件的拥有者和事件的响应者是同一个对象

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());

            MyForm form = new MyForm();
            form.Click += form.Clicked;
            form.ShowDialog();
        }
    }

    public class MyForm : Form
    {
        internal void Clicked(object sender, EventArgs e)
        {
            this.Text = DateTime.UtcNow.ToString();
        }
    }

事件的拥有者是事件响应者的字段成员,事件的响应者用自己的方法订阅着自己字段成员的事件

 static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
            Button button = new Button();
            TextBox textBox = new TextBox();
            MyForm myForm = new MyForm(button, textBox);
            myForm.ShowDialog();
          
        }
    }

    public class MyForm : Form
    {
        private Button Button;
        private TextBox TextBox;
        public MyForm(Button button,TextBox textBox)
        {
            this.Button = button;
            this.TextBox = textBox;
            this.Controls.Add(this.Button);
            this.Controls.Add(this.TextBox);
            this.Button.Text = "Click Me";
            this.Button.Top = 100;
            this.Button.Click += this.showMessage;
        }

        private void showMessage(object sender, EventArgs e)
        {
            this.TextBox.Text = "233333";
        }
    }

 

C#入门详解(11)

上一篇:【转载】C#中List集合使用Last方法获取最后一个元素


下一篇:C# Parellel.For 和 Parallel.ForEach