飞道的博客

学习笔记:C# Event 事件(一)

258人阅读  评论(0)

在类中,属性用来储存数据,方法用来进行逻辑运算,事件会使对象或者类具备通知能力的成员,用于对象或类间的动作协调和信息传递(消息推送)
所以说,事件在类中,和类中其它成员的地位是一致的。而区别于委托,委托和类的地位是相同的,委托也是类,是数据类型。

事件的功能 = 通知+可选事件参数(即详细信息)

事件多用于桌面,手机等开发的客户端编程,因为这些程序经常是用户通知事件来驱动(比如点击按钮等,按钮本质就是用事件模型实现的)
不同的语言实现事件模型的方法不同:C#用委托实现,Java用接口实现等等。。
MVC,MVP,MVVM等模式,是事件模式更高级更有效的玩法
我们大多使用C#提供的事件,而较少使用自定义的事件

事件模型:
1.我有一个事件
2.一个人或者一群人订阅了这个事件
3.这个事件发生了
4.订阅的人收到通知
5.响应/处理事件

上面的五条可以总结出事件模型的五个组成部分
1.事件的拥有者(event source,对象)
2.事件成员(event,成员)
3.事件的响应者(event subscriber,对象)
4.事件处理器(event handler,成员)
5.事件订阅-一种以委托类型为基础的约定

常用的事件模型:




先来一个简单的事件例子

using System;
using System.Timers;

namespace 事件练习
{
	class Program
	{
		static void Main(string[] args)
		{
			Timer timer = new Timer();//事件拥有者									  		
			timer.Interval = 1000;//.后 编辑器自动补全中:扳手:属性  方块:方法  闪电:事件
			Boy boy = new Boy();//事件响应者
			Girl girl = new Girl();
			timer.Elapsed += boy.Action;//事件&事件订阅  使用+=订阅,左边是事件,右边是事件处理器
										//如果想拿一个方法订阅一个事件,需要方法和事件遵循同一个约定,这个约定是个委托类型
			timer.Elapsed += girl.Action;
			timer.Start();
			Console.ReadLine();
		}
	}

	class Boy
	{
		internal void Action(object sender, ElapsedEventArgs e)//事件处理器
		{
			Console.WriteLine("Jump");
		}
	}

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

输出结果

再来试一试点击事件

using System;
using System.Windows.Forms;

namespace 事件练习2
{
	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)
		{
			form.Text = DateTime.Now.ToString();
		}
	}
}

每次点击一下窗口,窗口上方会显示当前的时间

事件的拥有者同时也是事件的响应者,运行效果同上:

using System;
using System.Windows.Forms;

namespace 事件练习2
{
	class Program
	{
		static void Main(string[] args)
		{
			MyForm form = new MyForm();
			form.Click += form.FormClicked;
			form.ShowDialog();
		}
	}

	class MyForm : Form//派生类
	{
		internal void FormClicked(object sender, EventArgs e)
		{
			this.Text = DateTime.Now.ToString();
		}
	}
}

带有button和text的窗体,事件的拥有者(button)是响应者form的成员

using System;
using System.Windows.Forms;

namespace 事件练习2
{
	class Program
	{
		static void Main(string[] args)
		{
			MyForm form = new MyForm();
			form.ShowDialog();
		}
	}

	class MyForm : Form//派生类
	{
		private TextBox textBox;
		private Button button;

		public MyForm() 
		{
			textBox = new TextBox();
			button = new Button();
			Controls.Add(button);
			Controls.Add(textBox);
			button.Click += buttonClicked;
			button.Text = "Say Hello";
			button.Top = 20;
		}

		private void buttonClicked(object sender, EventArgs e)
		{
			textBox.Text = "Hello World";
		}
	}
}


调整窗体的部分可以在新建项目时使用


转载:https://blog.csdn.net/akuojustdoit/article/details/116454362
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场