C# 多播委托 注意事项

委托的基本概念就不说了,我先简单说一下什么是多播委托。

包含多个方法的委托就是多播委托

简单地举了例子:

delegate void MyDelegate();



        static void Main(string[] args)

        {



            MyDelegate my1 = Write;



            my1 += Read;



            Console.ReadLine();

        }



        static void Write() 

        {

            Console.WriteLine("Write this is using named method");

        }



        static void Read()

        {

            Console.WriteLine("Read this is using named method");

        }

 

多播委托识别"+","+=","-","-=" 运算符,以从委托中删除或添加方法调用。

 

多播委托实际上就是多个委托的集合,如果在实行多播委托时,其中一个方法抛出异常,那么整个迭代都会停止。

       delegate void MyDelegate();



        static void Main(string[] args)

        {

            try

            {

                MyDelegate my1 = Write;

                my1 += Read;

                my1();

            }

            catch(Exception) 

            {

                Console.WriteLine("Error caught");

            }



            Console.ReadLine();

        }



        static void Write() 

        {

            Console.WriteLine("Write this is using named method");

            throw new Exception("Err in Write");

        }



        static void Read()

        {

            Console.WriteLine("Read this is using named method");

            throw new Exception("Err in Read");

        }

得到的结果是:

Write this is using named method

Error caught

为了避免这种方法,需要自己迭代列表。下面是修改后的代码

        delegate void MyDelegate();



        static void Main(string[] args)

        {

           

            MyDelegate my1 = Write;

            my1 += Read;



            Delegate[] dls = my1.GetInvocationList();



            foreach (MyDelegate dl in dls)

            {

                try

                {

                    dl();

                }

                catch(Exception)

                {

                    Console.WriteLine("Error caught");

                }

            }



            Console.ReadLine();

        }



        static void Write() 

        {

            Console.WriteLine("Write this is using named method");

            throw new Exception("Err in Write");

        }



        static void Read()

        {

            Console.WriteLine("Read this is using named method");

            throw new Exception("Err in Read");

        }

得到的结果是:

Write this is using named method

Error caught

Read this is using named method

Error caught

你可能感兴趣的:(C#)