.NET事件的指导原则
2013-08-30 17:36
246 查看
C#允许编写所需的各种类型的事件。但是,为了与.NET Framwork的组件相兼容,开发人员必须遵循微软为此建立的一系列指导原则。这些指导原则的核心是,事件处理程序必须拥有两个参数。第一个参数是一个引用,它指向产生该事件的对象;第二个参数为EventArgs类型,它包含处理程序所需的其他信息。因此,与.NET兼容的处理程序通常采用下面的通用形式:
其中,一般由调用代码向sender参数传递this值。e参数包含了附加的信息,如果方法并不需要这些信息,那么可以忽略他们。
EventArgs类本身并不包含传递附加数据给处理程序的字段。因此,EventArgs类只能用作基类,开发人员必须派生新的子类以包含必须的字段。另外,是EventArgs类定义的一个static字段,它可以存储不包含数据的EventArgs对象。
下面是我创建了一个与.NET兼容的事件
这个示例中呢, MyEeventAgrs派生于EventArgs类。 MyEeventAgrs类添加了一个自己的字段eventNum。接着,声明一个事件处理程序委托MyEnventHandler。该委托可以接受.NET Framework规定的两个参数。前面介绍过,第一个参数是对事件的对象的引用,第二个参数是对EventArgs类或者其派生类的引用。然后,定义XX和YY类中的事件处理程序Handler(),并使用了相同类型参数。
在MyEvent类的内部声明为SomeEvent的MyEventHandler事件委托。在OnSomeEvent()方法中调用SomeEvent事件委托时,将第一个实参指定为this,
第二个实参指定为一个MyEventArgs实例。因此,MyEventHandler事件委托可以获得正确的参数以实现与.NET兼容。
在基于消息的环境(windows操作系统)中,事件得到了广泛的应用。在这样的环境中,程序将一直等待,知道接收到消息才采取相应的行动。比如,我要在注册一个用户,而这个事件呢,一开始在运行这个程序的时候就已经注册了,现在一直是等待状态,当我填写完信息,在提交的那一刻,后台就会接受这个消息,指定到注册的事件中去处理,下面我写这样的一个程序,当我按某个键的时候,程序就会调用方法以激活事件。
最后,虽然本人不是做这种事件驱动模式做开发,不过这里给了初学者或对事件不明白的同学做了很好的示例,小弟不才,如果有错误的地方希望指出,互相交流学习。如果看了我这个也不是很明白的请访问
MSDN:
委托
http://msdn.microsoft.com/zh-cn/library/vstudio/900fyy8e.aspx
事件
http://msdn.microsoft.com/zh-cn/library/awbftdfh(v=vs.90).aspx
欢迎访问
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 = 0; 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 = 0; 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事件的指导原则
- .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
- .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则(转)
- .NET 事件模型教程(二)
- 08年思想上的一点收获分享【工作中我的三项指导原则】
- .NET 事件模型教程(一)
- 封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件"!
- 在这样的世界里,没人会不头晕的--关于最近的.net信任危机事件
- .net 非阻塞事件获取返回异步回调结果
- C#-深度好文-委托/事件/.net中其编程规范/Observer模式
- .net 事件
- .net开发时的诡异问题,button的onclick事件无效
- 在.net cf(C#)中捕获输入法面板(InputPanel&SIP)高度改变事件
- js调用.net后台事件,和后台调用前台等方法总结
- .NET keypress 事件之键盘输入控制
- 快速应用工程指导原则(Guidelines for Rapid APPLication Engineering)
- 方法中参数和返回类型的指导原则
- js调用.net后台事件,和后台调用前台等方法总结(转帖)
- .Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
- 设计指导原则