Delegate&Event
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delegate&Event相关的知识,希望对你有一定的参考价值。
Delegate
1.基本类:
1 public class Student 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 6 public void Study() 7 { 8 Console.WriteLine("学习.net高级班公开课"); 9 } 10 11 public void StudyAdvanced(string name) 12 { 13 Console.WriteLine("学习.net高级班公开课"); 14 } 15 16 public static void Show() 17 { 18 Console.WriteLine("123"); 19 } 20 }
2. 声明委托
1 public delegate void NoReturnNoPara(); 2 public delegate void NoReturnWithPara(int x, int y); 3 public delegate int WithReturnNoPara(); 4 public delegate string WithReturnWithPara(int x, int y);
3. =+ 的方法
1 private void DoNothing() 2 { 3 Console.WriteLine("这里是DoNothing"); 4 } 5 6 private static void DoNothingStatic() 7 { 8 Console.WriteLine("这里是DoNothing"); 9 } 10 11 private void ShowPlus(int x, int y) 12 { 13 Console.WriteLine("ShowPlus x={0} y={1} x+y={2}", x, y, x + y); 14 } 15 16 private static void ShowPlusStatic(int x, int y) 17 { 18 Console.WriteLine("ShowPlusStatic x={0} y={1} x+y={2}", x, y, x + y); 19 }
4.委托三部曲
声明(在上面)+实例化+调用
1 { 2 NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);//2 委托的实例化 3 method.Invoke();//3 委托调用 4 method();//另一种调用方式 5 //method.BeginInvoke(null, null);//异步调用 6 this.DoNothing();//直接调用对应的方法,效果一样 7 }
5.多播委托
1 { 2 NoReturnNoPara method = new NoReturnNoPara(MyDelegate.DoNothingStatic); 3 method += student.Study; 4 method -= student2.Study; 5 method += this.DoNothing; 6 method += student.Study; 7 method += Student.Show; 8 method += () => Console.WriteLine("这里lambda"); 9 method.Invoke(); 10 //method.BeginInvoke(null,null);//多播委托不能异步 11 method -= MyDelegate.DoNothingStatic; 12 method -= MyDelegate.DoNothingStatic; 13 method -= this.DoNothing; 14 method -= student.Study; 15 method -= Student.Show; 16 method -= () => Console.WriteLine("这里lambda"); 17 18 //委托里面lambda表达式之后加入的方法都无效了? 19 method.Invoke(); 20 } 21 { 22 NoReturnNoPara method = new NoReturnNoPara(student.Study); 23 method.Invoke(); 24 } 25 { 26 NoReturnNoPara method = new NoReturnNoPara(Student.Show); 27 method.Invoke(); 28 } 29 { 30 NoReturnWithPara method = new NoReturnWithPara(ShowPlus); 31 method += ShowPlus; 32 method += ShowPlus; 33 method += ShowPlus; 34 method -= ShowPlus; 35 method -= ShowPlus; 36 method(1, 2); 37 }
Event
1 public class Baby 2 { 3 public void Cry() 4 { 5 Console.WriteLine("{0} Cry", this.GetType().Name); 6 } 7 }
1 public class Brother 2 { 3 public void Turn() 4 { 5 Console.WriteLine("{0} Turn", this.GetType().Name); 6 } 7 }
1 public class Dog 2 { 3 public void Wang() 4 { 5 Console.WriteLine("{0} Wang", this.GetType().Name); 6 } 7 }
1 public class Father 2 { 3 public void Shout() 4 { 5 Console.WriteLine("{0} Shout", this.GetType().Name); 6 } 7 }
1 public class Mother 2 { 3 public void Wispher() 4 { 5 Console.WriteLine("{0} Wispher", this.GetType().Name); 6 } 7 }
1 public class Mouse 2 { 3 public void Run() 4 { 5 Console.WriteLine("{0} Run", this.GetType().Name); 6 } 7 }
1 public class Neighbor 2 { 3 public void Awake() 4 { 5 Console.WriteLine("{0} Awake", this.GetType().Name); 6 } 7 }
1 public class Stealer 2 { 3 public void Hide() 4 { 5 Console.WriteLine("{0} Hide", this.GetType().Name); 6 } 7 }
发布
1 /// <summary> 2 /// 发布者 3 /// 一只猫,miao一声 4 /// 导致一系列的触发动作 5 /// </summary> 6 public class Cat 7 { 8 public void Miao() 9 { 10 Console.WriteLine("{0} Miao", this.GetType().Name); 11 new Neighbor().Awake(); 12 new Mouse().Run(); 13 new Dog().Wang(); 14 new Baby().Cry(); 15 new Mother().Wispher(); 16 new Brother().Turn(); 17 new Father().Shout(); 18 } 19 20 public Action MiaoAction;//委托的实例 21 public event Action MiaoActionEvent;//事件是 委托的实例,加了event关键字-----发布者 22 //event做了权限控制,保证外部不能赋值和调用 23 public void MiaoDelegate() 24 { 25 Console.WriteLine("{0} MiaoDelegate", this.GetType().Name); 26 27 MiaoAction.Invoke(); 28 } 29 30 public void MiaoEvent() 31 { 32 Console.WriteLine("{0} MiaoEvent", this.GetType().Name); 33 if (MiaoActionEvent != null) 34 { 35 //MiaoActionEvent.Invoke(); 36 //MiaoActionEvent(); 37 foreach (Action item in MiaoActionEvent.GetInvocationList())//触发 38 { 39 Console.WriteLine("*********"); 40 item.Invoke(); 41 //item.BeginInvoke(null,null); 42 } 43 } 44 } 45 }
订阅:
1 { 2 Console.WriteLine("*******Miao******"); 3 Cat cat = new Cat(); 4 cat.Miao(); 5 6 Console.WriteLine("*******MiaoDelegate******"); 7 //cat.MiaoAction += new Neighbor().Awake; 8 9 cat.MiaoAction += new Mouse().Run; 10 cat.MiaoAction -= new Mouse().Run; 11 cat.MiaoAction += new Baby().Cry; 12 cat.MiaoAction += new Mother().Wispher; 13 14 cat.MiaoAction.Invoke(); 15 cat.MiaoAction = null; 16 17 cat.MiaoAction += new Brother().Turn; 18 cat.MiaoAction += new Father().Shout; 19 cat.MiaoAction += new Dog().Wang; 20 21 cat.MiaoDelegate(); 22 23 Console.WriteLine("*******MiaoEvent******"); 24 cat.MiaoActionEvent += new Neighbor().Awake; 25 cat.MiaoActionEvent += new Mouse().Run; 26 cat.MiaoActionEvent += new Baby().Cry; 27 28 //cat.MiaoActionEvent.Invoke(); 29 //cat.MiaoActionEvent = null; 30 31 cat.MiaoActionEvent += new Mother().Wispher; 32 cat.MiaoActionEvent += new Brother().Turn; 33 cat.MiaoActionEvent += new Father().Shout; 34 cat.MiaoActionEvent += new Dog().Wang; 35 cat.MiaoEvent(); 36 }
以上是关于Delegate&Event的主要内容,如果未能解决你的问题,请参考以下文章