最近在写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} 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,结果如图: