一、基本介绍
委托是一种引用类型,它表示对方法的引用,即委托就是一种用来指向一个方法的引用类型变量。
委托(Delegate)是一种特殊的类型,它定义了方法的类型,使得可以将方法作为参数传递,或者将其赋值给变量。委托是实现事件和回调方法的基础。
二、基本使用
定义委托类型:首先,你需要定义一个委托类型,指定它可以接受的方法的签名。
public delegate int Operation(int x, int y);
创建委托实例:然后,你可以创建委托类型的实例,并将方法赋值给它。
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a - b;
}
Operation op = new Operation(Add); // 将Add方法赋值给委托
调用委托:最后,你可以通过委托实例调用方法。
int result = op(5, 3); // 调用Add方法
委托与方法的匹配
- 方法签名匹配:委托定义的方法签名必须与要赋值给它的方法的签名完全匹配。
- 返回类型:方法的返回类型必须与委托定义的返回类型相同。
- 参数列表:方法的参数列表必须与委托定义的参数列表完全相同。
多播委托
C# 允许将多个方法赋值给同一个委托实例,这种委托称为多播委托。你可以使用 +=
和 -=
运算符来添加或移除方法。
public void ShowMessage(string message)
{
Console.WriteLine(message);
}
Operation op = new Operation(Add);
op += Subtract; // 添加Subtract方法
op += ShowMessage; // 错误:ShowMessage的签名与Operation不匹配
int result = op(5, 3); // 首先调用Add,然后调用Subtract
泛型委托
从C# 2.0开始,你可以使用泛型委托来定义可以接受任何类型参数的委托。
public delegate T Operation<T, U>(T x, U y);
委托与事件
委托在事件处理中扮演着核心角色。事件是一种特殊的多播委托,用于在特定事件发生时通知多个方法。
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}