参考并抄袭这两篇博客:
https://www.cnblogs.com/wudiwushen/archive/2010/04/21/1717378.html
http://www.cnblogs.com/landeanfen/p/4642848.html
1、委托
1 //1、定义委托 2 // 根据委托的使用方式可视情况更改返回类型和添加输入参数 3 public delegete void EventHandler(); 4 //2、定义方法 5 // 这里方法没有返回值,如有返回值的话应修改委托的返回类型 6 public void Fun1() 7 { 8 Console.WriteLine("我是添加到委托里的方法1"); 9 } 10 public void Fun2() 11 { 12 Console.WriteLine("我是添加到委托里的方法2"); 13 } 14 15 //3、将方法添加进委托中 16 EventHandler eventHandler=new EventHandler(Fun1);//简写为EventHandler eventHandler=Fun1; 17 eventHandler+=Fun2; 18 //运行委托 19 eventHandler();
自定义委托有点麻烦,又看到C#里面Func类型的委托可用于处理有参数有返回值的方法
1 //无参数有返回值 2 private static object Test3() 3 { 4 Console.WriteLine("Func Test3, Parameter"); 5 return Guid.NewGuid().ToString(); 6 } 7 8 //有参数有返回值 9 private static object Test4(string strRes) 10 { 11 Console.WriteLine("Func Test4, Parameter and Return Value"); 12 return strRes;
13 } 14 static void Main(string[] args) 15 { 16 var oFunc1 = new Func<object>(Test3); 17 var ofuncRes1 = oFunc1.Invoke(); 18 var oFunc2 = new Func<string, object>(Test4); 19 var ofuncRes2 =oFunc2("a");
20 }
具体使用的话,看了大神的实际使用样式,需要以后慢慢琢磨。
2、事件的使用
事件差不多就是特殊的委托。
事件重要事项:
触发事件:调用(Invoke)事件的术语。当事件被触发时,所有注册到他的方法都会被依次调用。
发布者(Publish):让事件被其他类或结构可见并使用的类或结构。
订阅者(subscriber):把事件和发布者关联注册的类和结构
事件处理程序:注册到时间的方法。
实例:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Publisher publisher = new Publisher(); 6 Console.Write("请输入要发布的杂志:"); 7 string name = Console.ReadLine(); 8 if(name=="男人装") 9 { 10 publisher.Publish += MrGao.Receive; 11 publisher.issue("男人装出版啦!"); 12 } 13 Console.ReadKey(); 14 } 15 }
//发布者类 16 public class Publisher 17 { 18 public delegate void EventHandler(object sender,PubEventArgs e); 19 public event EventHandler Publish; 20 21 protected virtual void OnPublish(PubEventArgs e) 22 { 23 if(Publish!=null) 24 { 25 this.Publish(this, e); 26 } 27 } 28 public void issue(string magazineName) 29 { 30 OnPublish(new PubEventArgs(magazineName)); 31 } 32 }
//订阅者类
33 public class MrGao 34 { 35 public static void Receive(object sender,PubEventArgs e) 36 { 37 Console.WriteLine("订阅者收到发布内容!发布内容为:{0}",e.magazineName); 38 } 39 } 40 41 public class PubEventArgs:EventArgs 42 { 43 public readonly string magazineName; 44 public PubEventArgs() 45 { 46 } 47 public PubEventArgs(string magazineName) 48 { 49 this.magazineName = magazineName; 50 } 51 }