【c# 学习笔记】为什么要使用委托

上一章中我们可能会很疑惑,为什么需要委托?为什么不直接在MyMethod方法里直接调用Add方法,反而要实例化一个委托对象来完成调用呢?这岂不是自找麻烦吗?

当然,c#引入委托并不是自找麻烦。委托是c#最好的一个特性,它为后来的很多特性都打下了基础。委托使得一个方法可以作为另一个方法的参数进行传递,这就是委托最大的作用。如下例子:

例如我们要实现一个打招呼的方法,而每个国家打招呼的方式都不一样,刚开始我们可能会像下面这样实现打招呼的方法:

public void Greeting(string name,string language)

{

switch (language)

{

case "zh-cn":

ChineseGreeting(name);

break;

case "en-us":

EnglishGreeting(name);

break;

default:

EnglishGreeting(name);

break;

}

}

public void EnglishGreeting(string name )

{

Console.WriteLine("Hello, " + name);

}

public void ChineseGreeting(string name)

{

Console.WriteLine("你好, " + name);

}

若后续我们需要添加德国、日本等打招呼方法,就必须修改Greeting方法内的case语句,来适应新的需求,这样特别不方便。有了委托,我们就可以把函数作为参数,并像如下代码实现Greeting方法:

public delegate void GreetingDelegate(string name);

static void Main(string[] args)

{

//引入委托

Program p = new Program();

p.Greeting("小叶", p.ChineseGreeting);

p.Greeting("Tommy Li", p.EnglishGreeting);

Console.Read();

}

public void Greeting(string name,GreetingDelegate callback)

{

callback(name);

}

public void EnglishGreeting(string name)

{

Console.WriteLine("Hello, " + name);

}

public void ChineseGreeting(string name)

{

Console.WriteLine("你好, " + name);

}

如下,增加德国人打招呼:

class Program

{

public delegate void GreetingDelegate(string name);

static void Main(string[] args)

{

//引入委托

Program p = new Program();

p.Greeting("小叶", p.ChineseGreeting);

p.Greeting("Tommy Li", p.EnglishGreeting);

p.Greeting("Ha Wa", p.GermanyGreeting);

Console.Read();

}

public void Greeting(string name,GreetingDelegate callback)

{

callback(name);

}

public void EnglishGreeting(string name)

{

Console.WriteLine("Hello, " + name);

}

public void ChineseGreeting(string name)

{

Console.WriteLine("你好, " + name);

}

public void GermanyGreeting(string name)

{

Console.WriteLine("Hallo, " + name);

}

}

友情链接