编写事件简单机制

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 -= 委托对象名称;

从以上代码可以看出,事件实质上是一种特殊的委托,通过多点委托的方法被多个方法订阅。当事件触发时,相应的事件处理方法将会被引用。

时间: 2024-08-17 04:14:34

编写事件简单机制的相关文章

Android的Touch事件分发机制简单探析

前言 Android中关于触摸事件的分发传递是一个很值得研究的东西.曾不见你引入了一个ListView的滑动功能,ListView就不听你手指的指唤来滚动了:也不知道为啥Button设置了onClick和onTouch,其中谁会先响应:或许你会问onTouch和onTouchEvent有什么区别,又该如何使用?这里一切的一切,只要你了解了事件分发机制,你会发现,解释这都不是事儿! 相关Touch事件的方法 1.public boolean dispatchTouchEvent(MotionEve

了解JQuery的事件绑定特性和事件命名空间机制,编写更好、更灵活的事件处理代码

JQuery中的bind()和unbind(),提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件.JQuery支持自定义事件,这显然给编程带来了极大的灵活性.下面就一起学习下,jquery事件处理的一些特性. 1.JQuery中事件可以重复绑定,不会覆盖. $("#button1").bind("click",function(){ alert("func1"); }); $("#button1&qu

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

《java小应用程序(Applet)和java应用程序(Application)分别编写的简单计算器》

Application和Java Applet的区别.Java语言是一种半编译半解释的语言.Java的用户程序分为两类:Java Application和Java Applet.这两类程序在组成结构和执行机制上都有一定的差异,主要体现在以下几方面:(1)运行方式不同.Java Application是完整的程序,可以独立运行:Java Applet程序不能单独运行, 它必须嵌入到用HTML语言编写的Web页面中,通过与Java兼容的浏览器来控制执行.(2)运行工具不同.Java Applicat

Android ViewGroup触摸屏事件派发机制详解与源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 该篇承接上一篇<Android View触摸屏事件派发机制详解与源码分析>,阅读本篇之前建议先阅读. 1 背景 还记得前一篇<Android View触摸屏事件派发机制详解与源码分析>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事

Android事件传递机制详解及最新源码分析——ViewGroup篇

在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴,强烈建议先阅读上一篇. 好了,废话还是少说,直奔主题,开始本篇的ViewGroup事件传递机制探索之旅. 依然从简单的Demo例子现象开始分析 新建安卓工程,首先自定义一个Button以及一个RelativeLayout,很简单,只是重写了主要与事件传递机制相关的方法,代码如下: 自定义WLButton类: 1 public class WLButton e

MaxCompute(原ODPS) 事件(Event)机制

摘要: 免费开通大数据服务:https://www.aliyun.com/product/odps 转自habai 什么是 MaxCompute事件机制 MaxCompute event 用于监控表和实例等MaxCompute资源(目前只用于监控表). 免费开通大数据服务:https://www.aliyun.com/product/odps 什么是MaxCompute 大数据计算服务(MaxCompute,原名ODPS)是一种快速.完全托管的TB/PB级数据仓库解决方案.MaxCompute向

javascript事件委托机制详解

以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点击一个li时实现弹出该li的信息 <ul class="top"> <li>橘子</li> <li>香蕉</li> <li>苹果</li> <li>梨子</li> <li>

Android事件分发机制详解:史上最全面、最易懂

前言 Android事件分发机制是每个Android开发者必须了解的基础知识 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天,我将全面总结Android的事件分发机制,我能保证这是市面上的最全面.最清晰.最易懂的 本文秉着"结论先行.详细分析在后"的原则,即先让大家感性认识,再通过理性分析从而理解问题: 所以,请各位读者先记住结论,再往下继续看分析: 文章较长,阅读需要较长时间,建议收藏等充足时间再进行阅读 目