多播委托-迭代

概述

  在讲解多播委托的迭代之前,先讲一下,在委托调用的一连贯方法中,若有其中一个方法带有异常的情况:

  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 one

2 two

3 three

  然而,如果委托调用的其中一个方法抛出异常,整个迭代就会停止.如下:

one

two

exception 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 }

输出结果为:

one

two

exception caught:Show::Two

three

 

你可能感兴趣的:(迭代)