

事件不会主动发生,而是由对象某些内部逻辑触发的
示例:
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: 上面的限制作用,就是面向对象的封装这个概念。把一些东西封装隐藏起来,在外部只暴露我想让你看到的东西。
事件对外界隐藏了委托实例的大部分功能,仅暴露添加/移除事件处理器的功能。

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

被折叠的 条评论
为什么被折叠?



