在C#中,委托(delegate)类似于指针一样,是指向某个具体的方法的引用类型变量。
一般用来进行 方法级别 解耦,提高灵活性和可扩展性。
声明委托:
//定义好3个委托
private delegate string delegateA();
private delegate string delegateB(string par);
private delegate int delegateC(int par);
定义好需要通过委托调用的方法:
/// <summary>
/// 在类中定义好方法
/// 在类外部使用委托调用
/// </summary>
class delegateClass
{
public string GetA()
{
return "delegateA--委托返回";
}
public string GetB(string par)
{
return par;
}
public int GetC(int par)
{
return par;
}
}
实例化委托:
//实例化目标类
delegateClass deleClass = new delegateClass();
//将委托与指定的方法绑定
delegateA @delegateA = new delegateA(deleClass.GetA);//绑定无参数方法
delegateB @delegateB = new delegateB(deleClass.GetB);//绑定一个字符类型参数方法
delegateC @delegateC = new delegateC(deleClass.GetC);//绑定一个整数类型参数方法
调用委托:
//输出委托调用后返回的结果
Console.WriteLine(delegateA.Invoke());
Console.WriteLine(delegateB.Invoke("delegateB--委托返回"));
Console.WriteLine("delegateC--委托返回--"+delegateC.Invoke(11));
输出结果:
委托的多播
在 delegateClass 增加两个方法
public void GetD()
{
Console.WriteLine("delegateD--委托返回");
}
public void GetE()
{
Console.WriteLine("delegateE--委托返回");
}
使用 新定义的 @delegateE 委托进行多播操作:
//实例化目标类
delegateClass deleClass = new delegateClass();
//将委托与指定的方法绑定
delegateA @delegateA = new delegateA(deleClass.GetA);//绑定无参数方法
delegateB @delegateB = new delegateB(deleClass.GetB);//绑定一个字符类型参数方法
delegateC @delegateC = new delegateC(deleClass.GetC);//绑定一个整数类型参数方法
//输出委托调用后返回的结果
Console.WriteLine(delegateA.Invoke());
Console.WriteLine(delegateB.Invoke("delegateB--委托返回"));
Console.WriteLine("delegateC--委托返回--"+delegateC.Invoke(11));
//委托多播
delegateE @delegateE = deleClass.GetE;//可以直接指定方法实例化委托
@delegateE += deleClass.GetD;//通过+=符号向委托追加需要多播操作的方法,同理-=可以在列表中删除多播的方法。
//调用多播委托列表
delegateE.Invoke();
输出结果:
委托的多播可以一次调用多个方法,具体的用法根据可以根据项目需要自行设计,微软给出的示例是 用来写日志,同时向多个位置(控制台、文件)输出日志,可以用来参考。