在C#中, 委托通常用来作为回调函数的参数, 又或者包装成事件做各种点击,触发事件.
其他: 下面代码是Action泛型 in 逆变的代码
逆变在泛型中主要修饰传入参数, 下面的例子中, Action因为in逆变,不仅接受B(子类),还可以接受A(父类,扩大范围,体现"逆").
void Main()
{
Demo demo = new Demo();
demo.NotifyEvent+=F1;
demo.NotifyEvent+=F2;
demo.NotifyEvent+=F1;
demo.NotifyEvent+=F2;
demo.NotifyEvent+=F3;
demo.InvokeAction();
void F1(A a)
{
nameof(F1).Dump();
}
void F2(B b)
{
nameof(F2).Dump();
}
void F3(B b)
{
throw new Exception("Error");
nameof(F2).Dump();
}
}
class Demo
{
private List<Action<B>> _action = new();
public event Action<B>? NotifyEvent
{
add
{
_action.Add(value);
}
remove
{
_action.Remove(value);
}
}
public void InvokeAction()
{
foreach(var action in _action)
{
action?.Invoke(null);
}
}
}
class A{}
class B:A{}
与逆变对应的协变out一般修饰返回值, 可以使泛型函数不仅返回父类,还可以选择顺势返回子类(缩写范围).
MulticastDelegate源代码:https://source.dot.net/#System.Private.CoreLib/src/System/MulticastDelegate.cs,115d292376227fdb
笔记来源:https://www.bilibili.com/video/BV1AT411U7H2