概念:
委托相当于一个变量,用来存储函数的
委托的使用步骤:
1.定义委托
//声明委托
2.实例化委托
//用方法进行实例化
//该方法名要与委托名一致
3.调用委托:
//调用委托
看下面的一个输出问候语的小程序:
class Program
{
public static void GreetPeople(string name)
{
EnglishGreeting(name);
}
public static void EnglishGreeting(string name)
{
Console.WriteLine("Morning," + name);
}
static void Main(string[] args)
{
string name;
name="xiaochun";
EnglishGreeting(name);
}
}
输出结果为:Morning,xiaochun
思考:如果需要加入汉语的问候方法怎么办?
class Program
{
public enum Language
{
English,Chinese
}
public static void GreetPeople(string name,Language lang)
{
switch(lang)
{
case Language.English:
EnglishGreeting(name);
break;
case Language.Chinese:
ChineseGreeting(name);
break;
default:
break;
}
}
public static void EnglishGreeting(string name)
{
Console.WriteLine("Morning," + name);
}
public static void ChineseGreeting(string name)
{
Console.WriteLine("早上好!" + name);
}
static void Main(string[] args)
{
string name1,name2;
name1="xiaochun";
name2 = "晓春";
EnglishGreeting(name1);
ChineseGreeting(name2);
}
}
思考:OK,问题解决了,但是如果我还想加入其它语言更多种问候方式呢?
这样的方式显然扩展性太差,我们增删改问候语的时候需要反复修改枚举和GreetPeople()。
你看上面的string name,当我们赋给name“Tom”时,他就代表“Tom”,当我们赋给name“小李”时,他就代表“小李”。那么,能不能有个方法可以像name那样,赋给它“ChineseGreeting”就代表“ChineseGreeting”,赋给它“EnglishGreeting”就代表“EnglishGreeting”呢?
还是否记得我们文章的第一句话,“委托相当于一个变量,用来存储函数的”,下面就让我们看一下委托时怎么应用的。
public delegate void Greeting(string name);
class Program
{
public static void EnglishGreeting(string name)
{
Console.WriteLine("Morning," + name);
}
public static void ChineseGreeting(string name)
{
Console.WriteLine("早上好!" + name);
}
private static void GreetPeople(string name,Greeting MakeGreeting)
{
MakeGreeting(name);
}
static void Main(string[] args)
{
GreetPeople("xiaochun", EnglishGreeting);
GreetPeople("小春", ChineseGreeting);
Console.ReadKey();
}
}
总结:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
了解更多,参考资料如下:
http://www.cnblogs.com/yangyancheng/archive/2011/04/21/2024145.html