C#学习笔记之多播委托的例子

发布时间:2020-04-27编辑:脚本学堂
本文介绍下,C#实现多播委托的一个例子,有需要的朋友,可以参考下吧。

代码如下:
 

复制代码 代码示例:
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  www.jb200.com
                foreach (MyDelegate my in myDelegate.GetInvocationList()) 
                { 
                    my(); 
                } 
     
                Console.Read(); 
            } 
             
        } 
    }
 

 有兴趣的朋友,可以动手测试下这段代码,看看效果如何?
 脚本学堂,祝大家学习进步。