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"); } } } }