C# 委托和事件
概述
委托
前提知识:
微软官方文档/C#概念/委托和事件
MulticastDelegate类
Delegate类
定义
- 当我们使用
delegate
关键字在程序中声明一个委托类型:
public delegate int Comparison<in T>(T left, T right);
- 编译器会在我们使用
delegate
关键字声明委托类型时,创建派生自System.MulticastDelegate
,且与委托签名相同的类:
System.Delegate
类及其单个直接子类System.MulticastDelegate
可提供框架支持,以便创建委托、将方法注册为委托目标以及调用注册为委托目标的所有方法。该委托编译后大致如下:
public class Comparsion<T> : System.MulticastDelegate
{
// 构造函数
public extern Comparison(object @object, IntPtr method);
// 开始异步调用,返回一个表示异步操作状态的IAsyncResult对象
public virtual extern IAsyncResult BeginInvoke(T left, T right, AsyncCallback callback, object @object);
// 结束异步调用,并返回调用结果
public virtual extern int EndInvoke(IAsyncResult result);
// 同步执行调用,直接返回调用结果
public virtual extern int Invoke(T left, T right);
}
- 编译器会为委托类型生成
添加
和移除
处理程序,以便可以对委托的实例添加和移除方法调用:
继承自System.MulticastDelegate类的添加方法调用
:
protected sealed override Delegate CombineImpl(Delegate? follow);
自称子System.MulticastDelegate类的移除方法调用
:
protected sealed override Delegate? RemoveImpl(Delegate value);
向委托添加调用目标
- 我们根据声明的委托类型Comparison声明一个委托实例
comparator
:
public Comparison<string> comparator;
- 我们需要定义与委托类型签名匹配的方法
CompareLength
,并将它分配给委托实例comparator
:
private int CompareLength<string>(string left, string right)
{
return left.Length.CompareTo(right.Length);
}
comparator = CompareLength;
- 调用委托:
int result = comparator("apple", "banana");
Console.WriteLine(result);
.NET Core框架提供的可重用的委托类型
Action:对任何具有void返回类型的委托都可以使用Action类型
public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);