20_22 事件详解

本文深入探讨了C#中的事件机制,包括事件如何由对象内部逻辑触发,事件声明的完整与简略形式,以及事件与委托的关系。事件参数类不必继承EventArgs,而EventArgs是编程约定。此外,事件提供了对委托字段的访问限制,增强了代码的安全性和可维护性,体现了面向对象的封装思想。

在这里插入图片描述
在这里插入图片描述
事件不会主动发生,而是由对象某些内部逻辑触发的

示例:

class Demo_Event_2
    {
        public void test()
        {
            Form form = new Form();
            Controller controller = new Controller(form);
            form.Register_ClickEvent();
            form.ShowDialog();

            MyForm myForm = new MyForm();
            myForm.Click += myForm.FormClicked;
            myForm.ShowDialog();
        }

    }

    class Controller
    {
        private Form form;
        public Controller(Form form)
        {
            this.form = form;
            form.Click += Form_Click;
        }

        private void Form_Click(object sender, EventArgs e)
        {
            form.Text = DateTime.Now.ToString();

        }
    }

    static class Form_Controller
    {
        public static void Register_ClickEvent(this Form form)
        {
            form.Click += Form_Click;
        }

        private static void Form_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Form_Controller");
        }
    }

    class MyForm : Form
    {
        private TextBox textBox;
        private Button button1;
        private Button button2;
        public MyForm()
        {
            textBox = new TextBox();
            textBox.Width = 250;
            textBox.Location = new System.Drawing.Point(20, 20);

            button1 = new Button();
            button1.Top = textBox.Location.Y + textBox.Height;
            button1.Left = textBox.Location.X;
            button1.Click += (sender, e) =>
            {
                textBox.Text = "Click button at:";
            };
            button1.Click += this.FormClicked;

            button2 = new Button();
            button2.Top = button1.Top;
            button2.Left = button1.Width + button1.Location.X;
            button2.Click += this.FormClicked;

            this.Controls.Add(textBox);
            this.Controls.Add(button1);
            this.Controls.Add(button2);
        }


        internal void FormClicked(object sender ,EventArgs e)
        {
            if(sender == button1)
            {
                textBox.Text += DateTime.Now.ToString();
            }
            else
            {
                textBox.Text = "Click Button2";
            }
        }
    }

事件的声明
在这里插入图片描述
事件声明有完整声明和简略声明两种,简略声明是完整声明的语法糖。
事件无论是从表层约束还是从底层实现都是依赖于委托的。

事件参数类并不一定要继承EventArgs类
一句话,EventArgs更像一种命名规范, 编程的一种系统库提供的一种约定规则,我们自己写的代码,也按照这个规则来,方便别人理解你写的代码的意图。
按自己的理解来说:或许你自己写的事件也会应用到C#核心内容中,这个时候继承了EventArgs就不用担心类型的问题了,可以直接响应,因为该Args是EventArgs的子类
(草,自己钻研了半天结果发现课的后半部分就在解释这个我吐了)

同样的,可以不借助event类字段实现订阅
按自己的理解来说:通过event实现了一种类似属性的作用,保护相关的委托字段得以设置为private
详细点说,你可以自由的改变委托参数从而做一些你本不能做的事情(例如点菜给别人,结果按照逻辑账单算自己头上),而使用event保护后,该对象只能遵循类内设定好的逻辑老老实实发起事件

事件的本质是一个蒙版。

蒙板 Mask: 事件这个包装器对委托字段的访问起限制作用,只让你访问 +=、-= ,让你只能给事件添加或移除事件处理器。让程序更加安全更好维护。

封装 Encapsulation: 上面的限制作用,就是面向对象的封装这个概念。把一些东西封装隐藏起来,在外部只暴露我想让你看到的东西。

事件对外界隐藏了委托实例的大部分功能,仅暴露添加/移除事件处理器的功能。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值