首页 > 代码库 > 多播委托-迭代
多播委托-迭代
概述
在讲解多播委托的迭代之前,先讲一下,在委托调用的一连贯方法中,若有其中一个方法带有异常的情况:
1)实现方法的类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DelegateWithIteration { 7 class Show { 8 public static void One() { 9 Console.WriteLine("one");10 }11 12 public static void Two() {13 Console.WriteLine("two");14 throw new ArgumentException("Show::Two"); //带有异常的方法.15 }16 17 public static void Three() {18 Console.WriteLine("three");19 }20 }21 }
2)调用方法的多播委托类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DelegateWithIteration { 7 class Program { 8 static void Main(string[] args) { 9 Action action = Show.One;10 action += Show.Two;11 action += Show.Three;12 try {13 action(); //直接调用多播委托.14 }15 catch (System.Exception ex) {16 Console.WriteLine("exception caught:" + ex.Message);17 }18 }19 }20 }
可以测试,如果Show类中的 Two方法没有异常,则输出为:
1 one2 two3 three
然而,如果委托调用的其中一个方法抛出异常,整个迭代就会停止.如下:
onetwoexception caught:Show::Two
在方法Two抛出异常后,迭代停止,方法Three不会得到执行.解决的问题是:应该自己迭代方法列表,并对每个委托实例都进行异常捕捉:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DelegateWithIteration { 7 class Program { 8 static void Main(string[] args) { 9 Action actions = Show.One;10 actions += Show.Two;11 actions += Show.Three;12 foreach (Action action in actions.GetInvocationList()) { //自己迭代方法列表.13 try { //对每个委托实例进行异常捕捉.14 action();15 }16 catch (System.Exception ex) {17 Console.WriteLine("exception caught:" + ex.Message);18 }19 }20 }21 }22 }
输出结果为:
onetwoexception caught:Show::Twothree
多播委托-迭代
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。