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. 自动生存Makefile教程 autoscan aclocal autoconf autoheader automake configure

    LZ没学过makefile的写法,只知道使用tab.于是乎发现了autotools系列工具 基本流程是:autoscan.aclocal.autoconf.autoheader.automake.co ...

  2. Java算法求最大最小值,冒泡排序,斐波纳契数列一些经典算法<不断更新中>

    清明在家,无聊,把一些经典的算法总结了一下. 一.求最大,最小值 Scanner input=new Scanner(System.in); int[] a={21,31,4,2,766,345,2, ...

  3. OC1_汉字拼音转换 练习

    // // WordManager.h // OC1_汉字拼音转换 // // Created by zhangxueming on 15/4/27. // Copyright (c) 2015年 z ...

  4. 模板:qsort+bsearch应用

    (1)qsort: 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)( ...

  5. the evaluation period for visual studio trial edition has ended的解决方法-转发

    首先献上自己收集的Visual studio 2008序列号: Visual Studio 2008 Professional Edition: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4 ...

  6. centos svn安装

    http://fengjunoo.iteye.com/blog/1759265(参考) 以前在ubuntu上安装过一次svn,那次弄得有些麻烦. 这次记录下centos环境下安装svn的步骤 其实简单 ...

  7. SQL Server代理服务无法启动的处理方法(转载)

    SQL Server代理服务无法启动问题的确很让我们头疼,下面就为您介绍SQL Server代理服务无法启动的处理方法,希望对您能有所帮助. --==配置环境服务器环境为32位Intel® Xeon® ...

  8. C#关于编码、解码相关问题

    编码.解码技术是我们在程序中开发中经常使用到的,对一些敏感信息的存储,比如密码之类的,我们一般是不会直接以明文直接存储到数据库的,而是会通过各种算法,可以是现成的MD5(一种散列算法).或者是Hash ...

  9. c#WebBrowser进阶

    WebBrowser的基本功能就是访问网页,但是由于它本身就不在主线程上面,所以程序判断它什么时候加载完成了,比较麻烦.为此我集合从网上找到的内容,做了一个例子. 其中包括了给WebBrowser设置 ...

  10. laravel homestead

    laravel homestead真是个好东西啊,折腾了很长时间,终于ok啦. 安装成功之后,在-目录下有个homstead,进入执行vagrant up clzdeMBP:Homestead clz ...