博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

C#事件浅淡(1)

最近在写C#,感觉事件这个机制很好,可是怎么实现自己定义的事件呢?查了资料有的不全有的不完整,有的太深,自己写一个简单的例子。

原则

1,定义一个事件信息类(标准的都继承EventArgs)

2、定义一个委托(标准的是EventHandler结尾),可以写在命名空间里,类里都行,区别自己查

3、就是定义一个此委托下的一个事件了。

4、事件调用方法(也就是何种情况下调用这个事件,一般都叫On方法,多以On开头)

5、用户处理方法,(一般这个不在事件类里面)

1和2可以没有,下一文章再讲,这里讲一个完整的流程

(1)、定义消息类

 1  public class PersonEventArgs : EventArgs
 2     {
 3 
 4         private int oldAge;
 5 
 6         public int OldAge
 7         {
 8             get { return oldAge; }
 9         }
10         public PersonEventArgs(int age)
11         {
12             this.oldAge = age;
13         }
14 
15     }

 

(2,3,4)、定义事件类

 1  public delegate void PersonEventHandler(object sender, PersonEventArgs e);
 2     /// <summary>
 3     /// '************************************************
 4     /// //'◇作者:李阳阳
 5     /// //'◇小组:无
 6     /// //'◇说明:事件测试类
 7     /// //'◇版本号:V1.0.0
 8     /// //'◇创建日期:2016/5/10 8:04:51
 9     /// ///'*************************************************
10     /// </summary>
11     public class Person
12     {
13         public event PersonEventHandler AgeChanged;
14 
15         protected virtual void OnAgeChanged(PersonEventArgs e)
16         {
17             if (AgeChanged != null)
18             {
19                 AgeChanged(this, e);
20             }
21         }
22 
23         private string name;
24         public string Name
25         {
26             get { return name; }
27             set { name = value; }
28         }
29         private int age;
30 
31         public int Age
32         {
33             get { return age; }
34             set
35             {
36                 if (age != value)
37                 {
38                     int orage = age;
39                     age = value;
40                     OnAgeChanged(new PersonEventArgs(orage));
41                 }
42             }
43         }
44 
45         public void AddAge(int icrAge)
46         {
47             int orage = age;
48             age += icrAge;
49             OnAgeChanged(new PersonEventArgs(orage));
50         }
51 
52         public override string ToString()
53         {
54             return string.Format("Name:{0}\t Age:{1}", name, age);
55         }
56         public Person()
57         {
58             name = "";
59             age = 0;
60         }
61 
62         public Person(string name, int age)
63         {
64             this.name = name;
65             this.age = age;
66             // author : lyy : 2016/5/10 8:14:36
67             // last change : 
68             /// 说明:  可以再这个地方添加一些预处理事件
69             //   this.AgeChanged += new PersonEventHandler(Person_AgeChanged);
70 
71         }
72 
73         void Person_AgeChanged(object sender, PersonEventArgs e)
74         {
75             this.name = "我的名了没有变:" + name;
76             //throw new NotImplementedException();
77         }
78     }

 

(5)事件类的应用

 1  static void Main(string[] args)
 2         {
 3             Person p = new Person("sb", 24);
 4             Console.WriteLine(p.ToString());
 5             p.AgeChanged += new PersonEventHandler(p_AgeChanged);
 6             string a = Console.ReadLine();
 7             p.AddAge(int.Parse(a));
 8 
 9             Console.WriteLine(p.ToString());
10             Console.Read();
11         }
12 
13         static void p_AgeChanged(object sender, PersonEventArgs e)
14         {
15             Console.WriteLine("我手动修改了年龄");
16             Person ptemp = sender as Person;
17             // author : lyy : 2016/5/10 8:18:50
18             // last change : 
19             /// 说明: 为了看到效果我们在事件操作中再次更改年龄的值
20             Console.WriteLine(string.Format("增加后的年龄{0}", ptemp.Age));
21           
22             Random rd = new Random(2);
23 
24             ptemp.Age = rd.Next(0,100);
25             Console.WriteLine(string.Format("我在事件中又修改了年龄{0}",ptemp.Age));
26          //   throw new NotImplementedException();
27         }

6,结果如图:

posted @ 2016-05-10 08:48  ants_double  阅读(174)  评论(0编辑  收藏  举报