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

  • 相关阅读:
    编译和和运行amor
    用好C语言的中库,系统错误的处理
    C语言中的宏
    时隔多年,再次实现的链表
    脚本更改桌面背景
    python爬虫 一个security的RSA加密爬虫
    mysql 8.0版本
    mysql5.7的并行复制
    kinshard中间件问题
    Springboot2-@Transactional 事务不生效
  • 原文地址:https://www.cnblogs.com/nonkicat/p/2796656.html
Copyright © 2011-2022 走看看