笔者愚钝,又不很勤捞,但是总有想要成为大神的心。做项目,需要用c#语言,可之前学的是c++,无奈之下只能自学c#。从图书馆借了几本书,但都是实践教程,基础部分过得很快。看到委托的时候,有点懵逼。又翻阅大神们写的关于委托的例子,才勉强明白委托的含义。
书上没有给出委托的定义,但都不约而同的提到了:为了弥补去掉指针对语言灵活性带来的影响,c#引入了新的类型——委托。
我脑子不好使,还是不懂,于是就看各种书各种资料,找到代码比对,有了浅显的了解。说白了,委托就是一种对对象的调用。其特点是只要参数一致,无论对象长的高矮胖瘦,都可以调用。
委托的一般声明是这样的:
[public] delegate void [name](参数);
老生常谈,当我想用编程实现和不同国家的人打招呼,我需要转换语言。但是用(switch—case)或者(if—else)未免形式上有些不美观,而且没意思。但是有了委托,我们利用委托就可以做到转换语言。代码如下:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegareANDEvent
{
class SayHello
{
public string Hello_to_English()
{
return "Hello,sir!";
}
public string Hello_to_Chinese()
{
return "先生您好!";
}
}
class Program
{
public delegate string Hello(); //委托的声明,可以放在类外
static void Main(string[] args)
{
SayHello hello = new SayHello(); //创建对象(实例化对象)
Hello H; //创建委托对象
H = new Hello(hello.Hello_to_Chinese);//让委托的对象指向一个方法
Console.WriteLine(H());
H = new Hello(hello.Hello_to_English);
Console.WriteLine(H());
Console.ReadLine();
}
}
}
看到这里我就继续翻书,看其他书。现在将清华大学出版社出版的《c#实践教程》(第二版)关于委托的代码附上:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Show(USA);
Show(China);
Console.ReadLine();
}
private static void China()
{
Console.WriteLine("这里是中国!");
}
private static void USA()
{
Console.WriteLine("This is America!");
}
private static void Show(Country country)
{
country();
}
public delegate void Country();
}
}
这个代码看得我恶心极了,虽然不长,但是不明白为什么不能正着写,读者看的时候可以从下往上看。这里的委托对象country()是一个无参类型无返回值的,和上面China与USA一样,因此主函数调用的时候,Show()直接调用里面的参数作为对象。
这本书给了一个警告:委托返回值大多定义为void,因为一个委托变量可以工多个方法来绑定(这就是方法绑定的内容),如果定义了返回值,那么多个有返回值的方法都会向调用语句返回数值,结果就是和面的返回值将前面的覆盖掉,因此委托只能获得最后一个方法调用的返回值。