最近在写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 ///3 /// '************************************************ 4 /// //'◇作者:李阳阳 5 /// //'◇小组:无 6 /// //'◇说明:事件测试类 7 /// //'◇版本号:V1.0.0 8 /// //'◇创建日期:2016/5/10 8:04:51 9 /// ///'*************************************************10 /// 11 public class Person12 {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 Name25 {26 get { return name; }27 set { name = value; }28 }29 private int age;30 31 public int Age32 {33 get { return age; }34 set35 {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:3667 // 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:5018 // 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,结果如图: