概述
在C#中,委托(Delegate)是一种类型安全的函数指针,它允许你引用一个或多个方法。委托特别适用于需要回调方法或事件处理程序的场景。通过委托,你可以将方法作为参数传递给其他方法,并在适当的时机调用这些方法。 c#委托的作用和c语言中的函数指针是对应的,灵活的使用委托可以有效降低耦合度。
委托的基本用法
- 定义委托:首先,你需要定义一个委托类型,指定该委托可以引用的方法签名。
- 实例化委托:然后,创建委托类型的实例,并将其与一个或多个具有兼容签名的方法关联起来。
- 调用委托:最后,你可以像调用普通方法一样调用委托实例,从而间接调用与之关联的方法。
什么时候使用委托?
- 当你需要将方法作为参数传递给另一个方法时。
- 在实现事件和回调方法时。
- 需要在运行时决定要执行哪个方法时。
示例
假设我们有一个简单的场景:根据不同的条件来计算两个数的和或者差。我们可以使用委托来实现这个功能。
using System;
// 定义一个委托类型,它可以指向任何返回int并接受两个int参数的方法
public delegate int MathOperation(int a, int b);
class Program
{
static void Main()
{
// 实例化委托,分别指向Add和Subtract方法,
//注意:
//1: add 和 subtract分别是 两个 MathOperation 委托类型的变量,可以是该类型的委托值,这个 值只能是满足 匹配该 类型委托的方法签名的 方法名
//2: Add和Subtract 都是方法名字,这里不要给方法名后面加括号(), 因为加上括号()就是对方法的调用了,其表达式就是方法的返回值(运行结果)! 方法名是调用函数的入口(地址),向委托赋值的就是这个入口(地址)!
MathOperation add = Add;
MathOperation subtract = Subtract;
// 调用委托
Console.WriteLine("Add result: " + PerformOperation(10, 5, add));
Console.WriteLine("Subtract result: " + PerformOperation(10, 5, subtract));
}
// 定义两个方法,它们都符合MathOperation委托的签名
public static int Add(int a, int b)
{
return a + b;
}
public static int Subtract(int a, int b)
{
return a - b;
}
// 接受一个MathOperation委托类型的参数,并调用它
public static int PerformOperation(int a, int b, MathOperation operation)
{
return operation(a, b);
}
}
在这个例子中,MathOperation 是一个委托类型,它可以指向任何返回 int 并接受两个 int 参数的方法。PerformOperation 方法接受一个 MathOperation 类型的参数,并调用它来执行相应的数学运算。这样,我们就能够灵活地在运行时选择要执行的操作(加法或减法)。