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
            foreach (MyDelegate my in myDelegate.GetInvocationList())
            {
                my();
            }

            Console.Read();
        }
        
    }
}

 

posted @ 2014-10-31 18:23  Net-Spider  阅读(183)  评论(0)    收藏  举报