更多

C#学习-01 委托(delegate)

在C#中,委托是一些类型的统称,它的地位和类(Class)是一致的,它的作用和Java中的接口、C++中的函数指针类似。

委托的作用

要理解委托——尤其是对于已经学习过Java的人来讲——是非常不容易的。这是因为在习惯了类(Class)和接口(Interface)写法以及基本数据类型的写法后,面对委托这种类型,很多学习过Java的人经常会感到不知所措,一个委托的声明如下:

C#
// 定义委托:
public delegate int Comparison<in T>(T left, T right);

这段代码声明了一类函数,这类函数接受类型为T的两个参数并返回一个int值,当然现在这个声明没有任何实际作用。为了更好的理解这样的说法,可以想象一下你需要一种工具,这种工具可以用来比较两个东西的重量。符合这样要求的工具有很多,比如传统的物理天平、精确度更高的电子天平甚至是一个跷跷板,你不关心这种工具内部是怎么实现比较的,只知道将这两个物体放上这种工具,你就可以知道两个物体的重量比较的结果。
虽然很容易理解这样的想法,但具体到语法时,这句话看起来就像是在声明一个函数,但是它没有函数体,并且需要“;”结尾,这使得它看起来又像是一个变量的声明。在Java中,和上述代码提供类似功能的写法如下:

Java
public interface Comparison{
    int compare<T>(T left, T right);
}

将Java中的接口和C#中的委托进行比较其实并不完全合理,二者虽然都是各自语言中和类(Class)这个概念同等高度的概念,但实际上接口是指可以做一些(一件或多件)事情的主体,而委托特指只能做一件事情的主体。
若学习过C++,那么C++中的函数指针概念与C#中的委托概念更加相似:

C++
//为了简化理解,此处不采用模板写法
int (*comparison)(int left, int right);
委托的使用

委托的使用很简单,只需要把委托当做一个自定义的类型,就像你自定义了一个类一样。

C#
// 声明一个Comparison<T>类型的变量
Comparison<T> comparator;

//对该变量赋值
private static int CompareLength(string left, string right) =>
    left.Length.CompareTo(right.Length);
comparator = CompareLength;

//使用该委托
Console.WriteLine(comparator("Hello","World!"));

委托的最大好处就是你可以将一个函数作为一个变量传来传去,因此你可以用它来实现回调、在程序运行期间根据用户的要求选择不同的处理方式(例如决定使用快速排序抑或是堆排序等)等功能。

多播委托

待补充

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code