zoukankan      html  css  js  c++  java
  • c#' 回调函数、委托 事件、委托链异常

    回调函数:  当一个函数执行完,执行作为参数传进来的函数。 通常是通过函数指针来调用。当函数执行完,将指针地址作为参数传递给另一个函数,这个指针被用来调用所指向的函数,称之为回调函数。

    委托(delegate):委托的本质就是一个回调函数帆软封装。

    事件(event): 事件的本质其实是对委托的封装,因为c# 是一门自举语言,通过il 反编译器可以看到,event 最后会强制转化为 delegate 。所以说事件是一种特殊的委托,而且性能较差

    性能 :event<委托<回调函数

    // 委托链异常

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 委托和事件
    {
    
    
        public class EventBus
        {
            public static Action<string> Actions = null;
    
            public delegate void  @delegate(string name);
            public static @delegate mdelegate;
            public void SendMessage()
            {
                if (Actions != null)
                {
                    // 获取actions 中的action列表
                   var actiones=  Actions.GetInvocationList();
                    foreach (var item  in actiones)
                    {
    
                        var ac = (Action<string>)item;
                        ac.Invoke("sendMessage from EventBus");
                    }
    
                    // 这种方式,如果有一个委托发生异常,则后面的委托将停止执行,所以选择以上方式
                   // Actions.Invoke("sendMessage from EventBus");
                }
                if (mdelegate != null)
                {    // myDelegates 中的Delegate列表
                    Delegate[] myDelegates = mdelegate.GetInvocationList();
                    foreach (var item in myDelegates)
                    {
                        var de = (@delegate)item;
                        try
                        {
                            de("sssssssssssssssssss");
                        }
                        catch(Exception ex)
                        {
                            Console.WriteLine($"--{ex}");
                        }
                    }
    
                    // 这种方式,如果有一个委托发生异常,则后面的委托将停止执行,所以选择以上方式,用foreach
                    // mdelegate("11111111111");
                }
    
    
    
            }
           
        }
    }
    

      

  • 相关阅读:
    pycharm的background task一直更新index,速度慢的解决方法
    第一章 图像处理基础(直方图、高斯滤波、直方图均衡化)
    下载及配置Python+openCV
    封装axios的接口请求数据方法
    better-scroll封装上拉刷新,下拉加载更多功能
    封装js插件(loading)
    商品列表跳转详情页(项目过程思路)
    setInterval踩坑记
    Vue组件封装(以封装一个button组件为例)
    组件传值的方式
  • 原文地址:https://www.cnblogs.com/hnzheng/p/12777245.html
Copyright © 2011-2022 走看看