编写事件简单机制
Posted code、sky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写事件简单机制相关的知识,希望对你有一定的参考价值。
class Program
{
static void Main(string[] args)
{
//创建Name类的对象mynamr
Name myname = new Name();
//向myname对象Get事件注册事件处理方法myname_get
myname.Get += new Name.myEventHandler(myname_get);
Console.Write("\n请输入你的名字:");
//接受用户输入值并赋值给input变量
string input = Console.ReadLine();
//将input变量赋值给myname对象的Text属性
myname.Text = input;
}
//定义用于订阅事件的myname_get方法
//自定义事件信息类为Name类的嵌套类
static void myname_get(object sender, Name.NameEventArgs e)
{
//输出事件信息和事件发布者的属性
Console.WriteLine("\n\t=========事件处理方法=========");
Console.WriteLine("事件信息:{0}", e.ToString());
Console.WriteLine("事件发布者是:{0}", sender.ToString());
Console.WriteLine("你输入的名字是:{0}", ((Name)sender).Text);
}
}
public class Name
{
private string _name;
//定义myEventHandler委托类型
public delegate void myEventHandler(object sender, NameEventArgs e);
//定义Get事件
public event myEventHandler Get;
//定义可读写的Text属性
internal string Text
{
get
{
return this._name;
}
set
{
this._name = value;
//调用OnGet方法,并传递NameEventArgs类对象
this.OnGet(new NameEventArgs("Text属性被更改了"));
}
}
//定义OnGet方法,接收1个EventArgs类型的参数
void OnGet(NameEventArgs e)
{
//触发Get事件 传递里两个参数
this.Get(this,e);
}
//重写ToString()方法
public override string ToString()
{
return "Name类的对象";
}
//自定义事件信息类,继承于EventArgs类
public class NameEventArgs : EventArgs
{
string _args;
//重载构造函数,用于将参数值赋值给_args字段
public NameEventArgs(string s)
{
_args = s;
}
//重写ToString()方法,返回_args字段
public override string ToString()
{
return _args;
}
}
}
}
C#的事件机制
当用户输入值后,myname对象的Text属性被赋值,程序执行OnGet()方法,并传递自定义事件类NameEventArgs的对象。而OnGet()方法将触发Get事件,并传递对象自身以及NameEventArgs类的对象作为参数。订阅了Get事件的myname_get()方法被通知,主程序立即调用myname_get()方法,在方法中输出自定义事件类的字符串,以及事件发布者的字符串形式和属性值。
说明:必须理解事件和委托的联系,才能掌握事件机制的本质。
解析
大部分应用程序包括javascript、ActionScript等都有异步事件处理机制,而在C#中是由多点委托和事件来实现这种机制的。
这种设计模式可以称为“发布者/订阅者模式”,发布者发布事件,多个类订阅这个事件(类必须包含一个相应的事件处理方法)。当该事件被触发时,系统通知每个订阅者事件发生。触发事件所调用的事件处理方法是由委托来实现。在这种情况下,必须注意以下几点。
(1)委托类型的签名必须有两个参数,分别是触发事件的对象和事件信息。
(2)事件信息必须是由EventArgs类派生。
这样在写触发事件的对象类时不必知道事件信息对象类。事件信息对象类可以在运行时订阅或解除订阅特定的事件。简单地说,事件就是当对象或类(发布者)状态发生改变时,对象或类发出信息通知订阅者,发布者也被称为“事件源”。
说明:在其他语言的事件机制中也有类似的模式,如Java采用接口,在运行时使用多态的方式实现对事件接收者响应函数的调用。
编写简单的事件机制需要先定义委托类型,然后通过委托类型定义事件,最后事件处理方法订阅事件。假设定义了名为MyDel委托类型,事件名称为onclick,定义部分如以下代码所示:
public delegate 返回类型 MyDel(object sender, EventArgs e);
public event MyDel onclick
MyDel 委托对象名称 += new MyDel(事件处理方法);
//事件处理方法订阅onclick事件
onclick += 委托对象名称;
//事件处理方法取消订阅onclick事件
onclick -= 委托对象名称;
从以上代码可以看出,事件实质上是一种特殊的委托,通过多点委托的方法被多个方法订阅。当事件触发时,相应的事件处理方法将会被引用。
以上是关于编写事件简单机制的主要内容,如果未能解决你的问题,请参考以下文章
Redis学习之4种模式实践及机制解析(单机主从哨兵集群)
Ⅵ:zookeeper的Watcher事件监听机制
简单事件机制的研究
CocosCreator-如何处理鼠标事件
180609-Spring之事件驱动机制的简单使用
关于React的事件机制简单解释