委托是一种类型;事件是委托的一个实例。委托的意义:异步多线程、逻辑分离
public delegate string CateAction();//委托
public event CateAction CateActionEvent;//事件
事件只能在声明他的类内部调用(Invoke);委托可以在外部调用(Invoke);事件加了权限控制,保证事件不能在外部直接赋值和调用。
事件执行前要判断不为null;
public void CateEvent() { if (CateActionEvent!=null) { //string result1 = CateActionEvent.Invoke();//顺序调用1,返回值是委托中最后一个函数的返回值 //string result2 = CateActionEvent();//顺序调用2,返回值是委托中最后一个函数的返回值 foreach (CateAction item in CateActionEvent.GetInvocationList()) { string result3 = item.Invoke();//顺序调用3,可以获得每个函数的返回值 //item.BeginInvoke(null, null);//异步调用,多线程 } } }
若委托的方法具有返回值,直接执行委托实例,得到的返回值是最后一个方法返回的;要想获得委托中每个方法的返回值,使用GetInvocationList()获得方法集合,逐个调用,像上面的循环;
还有一个知识点就是,多播委托为变量配合lambda使用时,多个返回值只能返回最后一个值:
//无参数,返回string类型 Func<string> method = () => DateTime.Now.ToString(); Console.WriteLine(method.Invoke()); method += () => "1"; method += () => "2"; method += () => "3"; method += () => "4"; method += () => "5"; method += Test1; Console.WriteLine(method.Invoke());//带返回值的多播委托,只能获得最后一个方法的返回值 Console.Read();
public static string Test1() { return "Test1"; }
打印结果:2017/11/14 10:22:16 和 Test1
参考:http://www.cnblogs.com/renzhitian/p/6080751.html