一、简单介绍
1、委托是什么?
委托是一种类,也是一种数据类型。
2、委托可以用来做什么?
委托可以用来作为回调方法,可以用于模板方法中。
二、委托的使用
1、自定义委托
step1 声明委托
delegate int TestDelegate(int x, int y);
step2 新建委托实例
step3 调用委托所指向的方法
TestDelegate testDelegate = new TestDelegate(add);
int sum = testDelegate.Invoke(10, 20);
private int add(int x, int y)
{
return x + y;
}
委托所封装的方法返回值类型和参数类型要跟委托一致。
比如上述TestDelegate返回值类型是int,参数有两个且类型都是int,那么新建的testDelegate所封装的方法add必须满足返回值是int且带有两个int类型参数的条件。
2、C#的类库已经准备好的委托
2.1、Action:不带返回值
2.2、Func:带返回值
使用步骤:
step1 新建委托实例
step2 调用委托所指向的方法
使用方法:简单来说就是把Action和Func当普通类。
public void TestAction()
{
Action<string> action = new Action<string>(ShowMsg);
action.Invoke("Hello");
action("Hello");
Func<int, int, string> func = new Func<int, int, string>(AddNum);
string result = func(5, 3);
Console.WriteLine(result);
result = func.Invoke(5, 1);
Console.WriteLine(result);
}
private void ShowMsg(string msg)
{
Console.WriteLine(msg);
}
private string AddNum(int x, int y)
{
return $"Sum is {x + y}";
}
注意点就是作为参数传进去的方法,他的输入和输出一定要跟新建的委托匹配上。
action()和action.Invoke()效果是一样的。
三、委托的使用示例
当主体方法代码执行到委托调用这一步时,代码进入到委托所指向的方法,当指向的方法运行结束再回到主体方法,这样就相当于主体方法提供了一个实现这个功能的模板,只需要传入不同的委托就可以实现整体流程。
比如计算器计算的过程:
class Calculator
{
public void Calculate(int x, int y, Func<int, int, int> calFunc, Action<string> callBack)
{
int result = calFunc(x, y);
if (result == 7)
callBack?.Invoke("Get 7!");
}
}
class NumberOperate
{
public int Add(int x,int y)
{
return x + y;
}
public int Sub(int x,int y)
{
return x - y;
}
}
public void TestCalculator()
{
Calculator calculator = new Calculator();
NumberOperate numberOperate = new NumberOperate();
calculator.Calculate(10, -3, numberOperate.Add, (msg) =>
{
Console.WriteLine(msg);
});
calculator.Calculate(17, 10, numberOperate.Sub, printMsg);
}
private void printMsg(string msg)
{
Console.WriteLine("哈哈哈!{0}", msg);
}
运行TestCalculator()结果如下:
对于计算器来说,加减乘除等等所有的计算大体逻辑是这样的:读取输入数值,计算,显示计算结果。
为了提高代码的复用,可以把这个处理逻辑写成一个模板方法,“计算”作为委托类型的参数传入这个模板方法中,“显示计算结果”也可以作为一个委托类型的参数 当作回调函数。
(暂时想不出合适的例子,欢迎评论指导)
总的来说就是委托可以让方法作为参数传入到其他方法中,利用好委托的话,可以大大提高代码的复用程度。