相信大家也不是第一次听说过委托这个概念,之前一直了解,却没有去好好地总结,正好最近有机会,让我们来看看到底什么是委托吧?
首先,我们要知道什么是委托?
委托是一种特殊的类型(class),用途是来实现对一种方法的封装。在某种事件发生时,自动调用该方法。
一个委托代表了具有相同参数列表和返回值的所有函数。类是对象的抽象,委托是函数的抽象。
简单理解Delegate委托(或代理)是一种数据类型:它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法。
其次,定义知道了,怎么去用呢?可以把委托的使用分为四部:
1.定义一种委托。
2.委托执行时要调用方法。
3.定义一个委托实例。
4.委托实例的调用。
<div><pre name="code" class="csharp"><span style="font-size:18px;"> //定义一种委托。
delegate int GetCalculatedValueDelegate(int x, int y);
//委托执行时要调用方法。
static int AddCalculator(int x, int y)
{
return x + y;
}
static int SubCalculator(int x, int y)
{
return x - y;
}
static void Main(string[] args)
{
//定义一个委托实例。
GetCalculatedValueDelegate d = AddCalculator;
//委托实例的调用。
Console.WriteLine(d(10, 20));
} </span>
这样,我们就会发现,其实委托没有我们想象中的那么难。
最后,我们为什么要用它,它有什么优点?我们再来看一个例子。
<span style="font-family:KaiTi_GB2312;font-size:18px;">/// <summary>
/// the English speaker.
/// </summary>
/// <param name="name">The name.</param>
public void EnglishSpeaker(string name)
{
Console.WriteLine(
string.Format("Hello my name is {0} and I am English speaker.\n", name));
}
/// <summary>
/// the Chineses speaker.
/// </summary>
public void ChineseSpeaker(string name)
{
Console.WriteLine(
string.Format("您好我的名字叫{0},我是讲普通话的。\n", name));
}
/// <summary>
/// 根据上下文调用不同的方法
/// </summary>
/// <param name="name">string</param>
/// <param name="lang">enum</param>
private static void Say(string name, Language lang)
{
switch (lang)
{
case Language.Chinese:
Program.ChineseSpeaker(name);
break;
case Language.English:
Program.EnglishSpeaker(name);
break;
default :
break;
}
}
/// <summary>
/// Define speak delegate.
/// </summary>
/// <param name="name"></param>
private delegate void SpeakDelegate(string name);
/// <summary>
/// The base say function.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="speaker">The speaker.</param>
private static void Say(string name, SpeakDelegate speaker)
{
///Inoke the speaker function.
speaker(name);
}
///传递函数名进行委托方法绑定
Program.Say("钧航", ChineseSpeaker);
Program.Say("JK.Rush", EnglishSpeaker);</span>
其实,这上面的也是四部。只不过通过这个例子,我们可以发现委托的优点。
我们可以这样子认为:委托是一个类,它定义了方法的类型,使得可以将方法当作别一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托没有想象的那么难,但是委托常常不会自己出现,就好比我们最近做的云平台底层,委托常常与泛型、反射等等一起出现,这样会造成一个假象,使我们觉得委托很难。这时候,我们应该逐一击破,到最后你会发现它没有那么难。