事件设计的四个步骤
1 在事件发行者中定义一个事件
2 在事件发行者中触发事件
3 在事件订阅者中定义事件处理程序
4 向事件发行者订阅一个事件

 下面我们看一个小例子。。打印出键盘的按键操作
namespace Csharpdemo
{
  
public class EventDemo 
    {
        
public delegate void keyPress(string key); //定义与事件相关联的委托类型
        
public event keyPress OnkeyPress; //定义一个事件
        
public void isKeyPress(string key)//触发事件的方法
        {
            
if(OnkeyPress!=null)
            OnkeyPress(key);
        }
    }
    
public class eventTest
    {
        
public void showkey(string key)//定义事件处理程序
        {
            Console.WriteLine(
"你按下了{0}键", key);
        }
    }
    
class test
    {
        
static void Main()
        {
            
string para = Console.ReadLine();
            
while (para != "exit")
            {
                EventDemo ed 
= new EventDemo();
                eventTest et 
= new eventTest();
                ed.OnkeyPress 
+= new EventDemo.keyPress(et.showkey);//注册事件
                ed.isKeyPress(para); //触发事件
                para 
= Console.ReadLine();
            }
            
        }
    }
}


上面的事件是没有问题的,但是我们都希望自己写的东西大家一看就能明白,所以我们必须严格按照.NET FrameWork的事件设计准则去书写代码
1 事件的命名应遵循PascalCasing命名方式
2 申明delegate时使用void作为返回类型,事件接受两个传入参数一律命名为sender和e
3 定义一个事件提供数据的类对类以EventNameEventArgs进行命名,从EventArgs类派生然后添加事件的成员,
如果不需要事件提供数据的类,可以使用系统的System.EventArgs类作为类型
Eg: Public delegate void EventNameEventHander(Object sender,EventNameEventArgs e)  //声明委托
通常我们需要在引发事件的类中提供一个受保护的方法以OnEventName进行命名。在该方法中引发事件
Protected virtual void OnEventName(EventArgs e)
{
    if(EventName!=null)
    {
       EventName(this,e);
    }
}
下面我们将上面的代码改为符合设计准则的代码

 1 namespace CsharpEventDemo
 2 {
 3 
 4     public class keyPressEventArgs:EventArgs 
 5     {
 6         private string key;
 7         public  string Key
 8         {
 9             get { return key; }
10         }
11         public keyPressEventArgs(string _key)
12         {
13             key = _key;
14         }
15     }
16 
17     public class EventSender
18     {
19         public delegate void keyPressEventHander(object sender, keyPressEventArgs e);
20         public event keyPressEventHander keyPress;
21         protected virtual void OnKeyPress(keyPressEventArgs e)
22         {
23             keyPressEventHander hander = keyPress;
24             if (hander != null)
25                 keyPress(this, e);
26 
27         }
28         public void isKeyPress(string key)
29         {
30             OnKeyPress(new keyPressEventArgs(key));
31         }
32     }
33     public class EventReceive
34     {
35         public void Press(object sender, keyPressEventArgs e)
36         {
37             Console.WriteLine("您按下了{0}键" , e.Key);
38         }
39     }
40     class Event1
41     {
42         static void Main()
43         {
44             string para = Console.ReadLine();
45             while (para != "exit")
46             {
47                 EventSender es = new EventSender();
48                 EventReceive er = new EventReceive();
49                 es.keyPress += new EventSender.keyPressEventHander(er.Press);
50                 es.isKeyPress(para);
51                 para = Console.ReadLine();
52 
53             }
54         }
55     }
56 }
  到此我们一个完整的事件处理程序完成,本文旨在介绍.NET FrameWork事件的设计准则,更多可以参考MSDN
       注:本文属原创,转载请注名出处



转载请注明出处 http://www.liebo6.com