c#中的委托
委托:delegate
本质就是个密封类,与类平级
用于封装,解耦
声明语法
// 使用 delegate 关键字声明一个委托
delegate void Func(int x);
简单使用
eg.一个计算器
namespace ConsoleApp;
class Program
{
/**
* 声明委托
*/
public delegate double CalculateFunction(double x, double y);
/**
* 加法
*/
static double Add(double x, double y)
{
return x + y;
}
/**
* 减法
*/
static double Subtract(double x, double y)
{
return x - y;
}
// Test方法的参数就是一个方法(委托)
static void Test(CalculateFunction calculateFunction)
{
Console.Write("请输入x的值:");
double x = Convert.ToDouble(Console.ReadLine());
Console.Write("请输入y的值:");
double y = Convert.ToDouble(Console.ReadLine());
double result = calculateFunction(x, y);
Console.WriteLine($"x与y委托计算的结果>>>{result}");
}
static void Main(string[] args)
{
// 写法一:
// CalculateFunction cal = new CalculateFunction(Add);
// double d = cal(3, 4);
// 写法二:
// Test(new CalculateFunction(Add));
// 写法三:
Test(Add);
Test(Subtract);
Console.ReadKey();
}
}
常用方法
对委托最常使用的方法是 Invoke()
和 BeginInvoke()
/ EndInvoke()
。
Invoke()
会调用已附加到特定委托实例的所有方法。
eg.简单使用 +=、-=、Invoke()
namespace ConsoleApp;
class Program
{
public delegate double CalculateFunction(double x, double y);
public static CalculateFunction calFunc;
static double Add(double x, double y) => x + y;
static double Test2(double x, double y)
{
Console.WriteLine($"委托实现 Add >_<");
return Add(x, y);
}
static void Main(string[] args)
{
// 实例化委托(订阅)
calFunc += Test2;
// 取消订阅
// calFunc -= Test2;
// 调用委托
calFunc?.Invoke(11, 22);
}
}
与接口对比
接口实现了类的依赖注入
委托实现了方法的依赖注入