C# 委托 (Delegate)
C# 中的委托(Delegate) 类似于 C++中的函数指针,委托(Delegate) 是存有对某个方法的引用的一种引用类型变量,引用可以在运行时被改变。
委托(Delegate) 特别用于实现事件和回调方法,所有委托(Delegate)都派生自 System.Delegate 类
声名委托(Deleage)
//定义一个买东西的委托委托, 包含两个参数, 参数 1 购买个数,参数2 商品名字,返回类型为 void
public delegate void BuyHandler(string goods, int count);
// 定义一个写完作业的回调
public delegate void HomeWorkCallBack(string msg);
// 定义一个计算和的委托
public delegate int CalculateSum(int n);
下面设计一个场景
爸爸做饭没有酱油了,爸爸选择委托儿子去买酱油
儿子买回酱油后,爸爸安排儿子写作业,并且要求儿子写完作业后告诉爸爸(写完作业回调)
儿子的作业中有一些计算题需要委托爸爸帮忙计算
代码逻辑如下
public class Father
{
// 声名一个 Children
public Children children;
// 定义买酱油委托
private BuyHandler buySoyHandler;
public Father()
{
children = new Children();
// 委托 children 去 买一瓶酱油
// 将children.BuySomeThing作为委托函数传递过去
BuySomeThing("Soy", 1, children.BuySomeThing);
//也可以用下面方法调用
buySoyHandler = children.BuySomeThing;
BuySomeThing("Slat", 2, buySoyHandler);
// children 需要爸爸帮忙计算
children.SetCalculateSum(Calculate);
// 让 children 写完作业,并且写完作业要告诉爸爸(回调)
// 将函数 HomeWorkDoneCallBack 传递过去作为回调函数
children.HomeWork(HomeWorkDoneCallBack);
}
// 爸爸买酱油
public void BuySomeThing(string goods, int count, BuyHandler buyHandler)
{
if (null != buyHandler)
{
// 爸爸可以不用自己去啦,委托儿子去买酱油
buyHandler(goods, count);
}
else
{
Console.WriteLine("爸爸自己去买\n");
}
}
private void HomeWorkDoneCallBack(string msg)
{
Console.WriteLine(msg);
Console.WriteLine("好的我知道你写完作业了\n");
}
/// <summary>
/// 求 从 1 加到 n 的和
/// </summary>
private int Calculate(int n)
{
int sum = (1 + n) * (n / 2);
return sum;
}
}
public class Children
{
public CalculateSum calculateSum;
public void SetCalculateSum(CalculateSum handler)
{
calculateSum = handler;
}
public void BuySomeThing(string goods, int count)
{
Console.WriteLine(string.Format("儿子去买{0}_购买数量为{1}\n", goods, count));
}
public void HomeWork(HomeWorkCallBack callBack)
{
Console.WriteLine("儿子认真写作业\n");
Console.WriteLine("儿子有一个从 1 加到 n 的求和题需要爸爸帮忙计算\n");
int sum = calculateSum(100);
Console.WriteLine("从 1 加到 100 结果为:" + sum + "\n");
if (null != callBack)
{
string msg = "儿子写完作业啦\n";
callBack(msg);
}
}
}
运行结果如下