C#允许编写所需的各种类型的事件。但是,为了与.NET Framwork的组件相兼容,开发人员必须遵循微软为此建立的一系列指导原则。这些指导原则的核心是,事件处理程序必须拥有两个参数。第一个参数是一个引用,它指向产生该事件的对象;第二个参数为EventArgs类型,它包含处理程序所需的其他信息。因此,与.NET兼容的处理程序通常采用下面的通用形式:

void handler(object sender,EventArgs e)
{ }

其中,一般由调用代码向sender参数传递this值。e参数包含了附加的信息,如果方法并不需要这些信息,那么可以忽略他们。
EventArgs类本身并不包含传递附加数据给处理程序的字段。因此,EventArgs类只能用作基类,开发人员必须派生新的子类以包含必须的字段。另外,是EventArgs类定义的一个static字段,它可以存储不包含数据的EventArgs对象。

下面是我创建了一个与.NET兼容的事件

 class MyEeventAgrs:EventArgs
{
public int eventNum;
}
//申明一个委托类型事件
delegate void MyEnventHandler(object sender,MyEeventAgrs e); class MyEvent
{
static int count = ;
public event MyEnventHandler SomeEvent; public void OnSomeEvent()
{
MyEeventAgrs arg = new MyEeventAgrs(); if(SomeEvent!=null)
{
arg.eventNum = count++;
SomeEvent(this, arg);
}
}
}
class XX
{
public void Handler(object sender,MyEeventAgrs e)
{
Console.WriteLine("事件:"+e.eventNum+",收到一个XX对象");
Console.WriteLine("来源自:"+sender);
}
}
class YY
{
public void Handler(object sender, MyEeventAgrs e)
{
Console.WriteLine("事件:" + e.eventNum + ",收到一个XX对象");
Console.WriteLine("来源自:" + sender);
}
} class Program
{
static void One()
{
Console.WriteLine("Hello World");
}
static void Two()
{
Console.WriteLine("Two");
}
static void Main(string[] args)
{
XX x = new XX();
YY y = new YY();
MyEvent evt = new MyEvent();
evt.SomeEvent += x.Handler;
evt.SomeEvent += y.Handler;
evt.OnSomeEvent();
evt.OnSomeEvent();
}

这个示例中呢, MyEeventAgrs派生于EventArgs类。 MyEeventAgrs类添加了一个自己的字段eventNum。接着,声明一个事件处理程序委托MyEnventHandler。该委托可以接受.NET Framework规定的两个参数。前面介绍过,第一个参数是对事件的对象的引用,第二个参数是对EventArgs类或者其派生类的引用。然后,定义XX和YY类中的事件处理程序Handler(),并使用了相同类型参数。

在MyEvent类的内部声明为SomeEvent的MyEventHandler事件委托。在OnSomeEvent()方法中调用SomeEvent事件委托时,将第一个实参指定为this,

第二个实参指定为一个MyEventArgs实例。因此,MyEventHandler事件委托可以获得正确的参数以实现与.NET兼容。

在基于消息的环境(windows操作系统)中,事件得到了广泛的应用。在这样的环境中,程序将一直等待,知道接收到消息才采取相应的行动。比如,我要在注册一个用户,而这个事件呢,一开始在运行这个程序的时候就已经注册了,现在一直是等待状态,当我填写完信息,在提交的那一刻,后台就会接受这个消息,指定到注册的事件中去处理,下面我写这样的一个程序,当我按某个键的时候,程序就会调用方法以激活事件。

     class KeyEventArgs : EventArgs
{
public char ch;
}
class KeyEvent
{
public event EventHandler<KeyEventArgs> KeyPress; public void OnKeyPress(char key)
{
KeyEventArgs k = new KeyEventArgs();
if(KeyPress!=null)
{
k.ch = key;
KeyPress(this, k);
}
}
} class Program
{ static void Main(string[] args)
{
KeyEvent kvent = new KeyEvent();
ConsoleKeyInfo key;
int count = ;
kvent.KeyPress += (sender, e) => Console.WriteLine("接收到键:"+e.ch);
kvent.KeyPress += (sender, e) => count++;
Console.WriteLine("输入一些字符,输入.停止");
do
{
key = Console.ReadKey();
kvent.OnKeyPress(key.KeyChar);
} while (key.KeyChar!='.');
Console.WriteLine(count+"个键通过");
} }

最后,虽然本人不是做这种事件驱动模式做开发,不过这里给了初学者或对事件不明白的同学做了很好的示例,小弟不才,如果有错误的地方希望指出,互相交流学习。如果看了我这个也不是很明白的请访问

MSDN:

委托

http://msdn.microsoft.com/zh-cn/library/vstudio/900fyy8e.aspx

事件

http://msdn.microsoft.com/zh-cn/library/awbftdfh(v=vs.90).aspx

欢迎访问

.NET事件的指导原则的更多相关文章

  1. Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则

    因为大多数的FPGA内部的触发器数目相当多,又加上独热码状态机(one hot code machine)的译码逻辑最为简单,所以在FPGA实现状态机时,往往采用独热码状态机(即每个状态只有一个寄存器 ...

  2. SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  3. SQL Server 解读【已分区索引的特殊指导原则】(1)- 索引对齐

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  4. SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  5. 访客至上的Web、移动可用性设计--指导原则

    文章出自:听云博客 关于可用性设计,之前写过一个“纸上谈兵”版本的,那篇帖子主要是根据A/B test的方式来进行的. 但是最近找了本Steve krug写的Don't make me think,我 ...

  6. openstack 升级设计要求的指导原则

    不知道其他软件有没有类似的指导原则. Theory of Upgrade Grenade works under the following theory of upgrade. New code s ...

  7. Spring Batch 基本的批处理指导原则

    下面是一些关键的指导原则,可以在构批量处理解决方案可以参考: 请记住,通常皮脸处理体系结构将会影响在线应用的体系结构,同时反过来也是一样的.在你为批量任务和在线应用进行设计架构和环境的时候请尽可能的使 ...

  8. 精通Web Analytics 2.0 (13) 第十一章:变身分析忍者的指导原则

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第十一章:变身分析忍者的指导原则 这个激动人心的一章,分析了几乎所有工作的各个方面. 目标很简单:使用成熟的方法来帮助避免淹死的 ...

  9. 1   开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。   本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:    正确的使用数据库MetaData方法    只获取需要的数据    选用最佳性能的功能    管理连

    1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...

随机推荐

  1. Java的内存泄漏_与C/C++对比(转载总结)

    原文网址:http://developer.51cto.com/art/201111/302465.htm Java内存泄露的理解与解决(1)   一般来说内存泄漏有两种情况.一种情况如在C/C++ ...

  2. Java_Web _Servlet生命周期实验

    第一次加载这个servlet程序时(选择右边的servlet程序,注意servlet程序没有main函数,因此执行的是run as servlet Application ),同时执行init()方法 ...

  3. 使用javascript获取gridview中的textbox值

    <body> <form id="form1" runat="server"> <div> <asp:gridview ...

  4. 使用 vmstat 监测系统性能

    在linux/unix下,vmstat是常用的系统性能监测工具.常用用法如下 vmstat 1 10 表示以1秒为间隔,做相关参数的采样,一共10次.输出范例如下: procs ----------- ...

  5. 页面加载后的input change事件 1或2个框 ajax

    数据层没有,js和bll直接链接,数据层用的hqew. js: window.onload = function () { //型号input 改变 事件 $("#typeofproduct ...

  6. python 自动化之路 day 09 进程、线程、协程篇

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  7. 关于不使用web服务实现文本框自动完成扩展

    来博客园很久了,一直是伸手党,呵呵,现在终于申请了一个账号并开通了博客 下面分享下之前在一个项目里遇到的问题 前段时间在一个项目里要求在文本框内输入要搜索的内容,自动提示与此内容相关的词条 当时在博客 ...

  8. Sublime Text 中使用Git插件连接GitHub

    sublime Text的另一个强大之处在于它提供了非常丰富的插件,可以帮助程序员来适合大多数语言的开发.这些插件通过它自己的Package Controll(包管理)组件来安装,非常方便.一般常用的 ...

  9. oracle 11g实验五——触发器的使用

    实验要求: 实验五 触发器的使用 实验目的 1.  理解触发器的概念.作用及分类: 2.  掌握触发器的创建.使用: 实验内容 1.  建立表orders:用于存储订单列表信息:表order_item ...

  10. 推荐一款好用的java反编译软件——JavaDecompiler

    这款反编译器叫 "Java Decompiler",在网上也是久负盛名,最近因为工作需要找来用了下,果然不错,之前都是用eclipse的插件jad来看源码的.下面这个链接是Java ...