zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2021 省选颓记
    题解 UVA12459 Bees' ancestors
    题解 UVA10812 Beat the Spread!
    题解 UVA12230 过河 Crossing Rivers
    题解 P1850 [NOIP2016 提高组] 换教室
    题解 P1297 [国家集训队]单选错位
    CSP2020 游记
    学习笔记10-18
    【题解-SP1724 TRICOUNT】简单易懂的递推式写法
    题解:论如何利用 大 模 拟 吊打LGJ~
  • 原文地址:https://www.cnblogs.com/nonkicat/p/2796656.html
Copyright © 2011-2022 走看看