委托的相关概念
委托提供了类似C++中函数指针的功能,简单地说委托类型就是面向对象函数指针,
不过C++的函数指针只能够指向静态的方法,
而委托除了可以指向一个静态的方法之外还可以指向对象实例的方法,并且委托是完全面向对象且使用安全的类型。
也就是说:委托可以看成是一种类型安全的函数指针,它用来代理一类符合其要求的方法(包括静态方法和动态方法即实例的方法),同时它又可以作为一个方法的参数进行传。
对“符合其要求”的解释:委托的 返回类型 和 参数 要与被代理的方法的 返回类型 和 参数 一致(不仅类型一致,参数个数也要相同)。
?
委托的优点:委托允许程序设计师可以在执行时期传入方法的名称动态地决定欲调用的方法,灵活性和扩张性非常强。
委托一般用在事件、多线程和通用类库中。
?
下面列举了5个示例对委托的概念和基本用法进行说明(这些例子来自陈广老师和楚广明老师的课堂,自己稍作了修改和融合)
为了省去创建GUI那些繁琐的步骤,更清晰地逼近委托的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadKey()是为了使程序中途停下来,以便看清楚执行过程中的输出。
?
一、

二、


四、


using System;//五、最后一个例子namespace DelegateDemo{ delegate int MathOperationsDelegate(int value); class MathOperations { public static int MultiByTwo(int value) { return value * 2; } public static int Square(int value) { return value * value; } } class MyDelegate { public static void ProcessAndDisplayRusult(MathOperationsDelegate action, int value) { int result = action(value); Console.WriteLine(result); } static void Main() { MathOperationsDelegate[] operations = { new MathOperationsDelegate(MathOperations.MultiByTwo), new MathOperationsDelegate(MathOperations.Square) }; for (int i = 0; i < operations.Length; i++) { Console.WriteLine("使用operation[{0}]", i); ProcessAndDisplayRusult(operations[i], 3); } Console.ReadKey(); } }}输出结果:
使用operation[0]
6
使用operation[1]
9
<script type="text/javascript"></script>