namespace 多播委托 { /* * 以下的实例是一个关于多播委托的实例 * 多播委托应注意: * ① 委托可以包含多个方法,成为多播委托 * ② 因为要返回多个方法,所以委托的签名就必须返回void * ③ 多播委托的方法链的的顺序未经严格定义,所以避免使用任何依赖调用顺序的委托 * ④ 经过定义的多播委托逐个调用委托的方法,如果有任何一个出现错误, * 可以根据需要手动迭代下一个委托方法 */ //DisplayMethod类有三个静态方法 class DisplayMethod { //返回类型要定义为void public static void one() { Console.WriteLine("one"); } public static void two() { Console.WriteLine("two"); throw new Exception(); } public static void three() { Console.WriteLine("three"); } } //定义委托 public delegate void MyDelegate(); class Program { static void Main(string[] args) { //为委托添加方法,委托可以识别+, +=, -, -=运算符 //可以按下面的方式为委托添加方法 MyDelegate myOne = DisplayMethod.one; MyDelegate myTwo = DisplayMethod.two; MyDelegate myDelegate = myOne + myTwo; myDelegate += DisplayMethod.three; /* 可以用下面方法调用被委托的三个方法 * myDelegate(); * 也可以通过调用委托的GetInvocationList()方法来返回一个委托方法的数组, * 以迭代调用委托中的方法 */ foreach(MyDelegate my in myDelegate.GetInvocationList()) { try { my(); } catch { Console.WriteLine("throw error "); //如果有错误从委托列表中删除错误的方法 myDelegate -= my; } } Console.WriteLine("删除方法two后。。。 。。。"); //删除后的列表调用,只剩下one和three foreach (MyDelegate my in myDelegate.GetInvocationList()) { my(); } Console.Read(); } } }