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,結果如圖:
轉載于:https://www.cnblogs.com/ants_double/p/5476509.html
總結
- 上一篇: 链表系列之单链表——使用单链表实现大整数
- 下一篇: Linux防火墙设置-DNS服务器篇