C#入门:委托的简单理解
我们习惯于把数据作为参数传递给方法,例如:int max(int a,int b)。而有时某个方法执行的操作并不是针对数据进行的,而是要对另一个方法进行操作。更麻烦的是,在编译时我们不知道第二个方法是什么,这个信息只能在运行时得到,所以需要把第二个方法作为参数传递给第一个方法。这样的概念(抑或是说处理方法)利用C/C++里面的函数指针就可以很清晰地解决。 记得当初学习《数据结构》的课程时,实现遍历顺序表Traversal()就采用了函数指针来实现遍历元素时对应可能出现的函数(即方法)。所以说:C/C++语言的强大之处就在于指针,没有学会指针说你会C/C++其实一点意义都不大。
C#语言中的委托是寻址方法的.NET版本,换言之,就是在变相地使用指针。如何来理解委托呢?我们可以把委托理解成一些方法的模型。委托类型的声明与方法签名相似, 有一个返回值和任意数目任意类型的参数。对于一些方法,他们的参数和返回值得数据类型都是相同,仅仅具备的区别在于方法名称存在差异,对于这样满足一定模型的方法,我们就用委托来体现。
比如我们存在一段顺序表(暂且用数组来体现),现在我们要做的就是遍历这一段循序表。对于遍历,我们采取的操作手段是不同的,比如修改顺序表里的内容、查找顺序表里的特殊值、判断顺序表里的内容的合法性,抑或是仅仅简单的输出顺序表里的内容。
现在举出一个实例,就是调用一个方法,采用不同的排序算法。
/**
*@link http://blog.iliyang.cn
*@date 2012/08/27
*/
using System;
namespace Base
{
class Program
{
/// <summary>
/// 声明委托Sort|设定排序函数的模型
/// </summary>
/// <param name="array">欲排序的数组</param>
delegate void Sort(Int32[] array);
/// <summary>
/// 应用函数入口:仅限测试
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//创建一个顺序表(即一个数组)
Int32[] array = { 10, 13, 12, 23, 34, 5, 96, 7, 81, 9 };
Console.WriteLine("排序前:");
foreach (int value in array)
Console.Write(value + " ");
Console.WriteLine();
//Dispose(array, BubbleSort);
Dispose(array, SelectSort);
foreach (int value in array)
Console.Write(value + " ");
Console.WriteLine();
Console.ReadKey(true);
}
/// <summary>
/// 交换两个变量的值
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
static void Swap(ref Int32 a, ref Int32 b)
{
Int32 temp = a;
a = b;
b = temp;
}
/// <summary>
/// 冒泡法排序
/// </summary>
/// <param name="array"></param>
static void BubbleSort(Int32[] array)
{
for (int i = array.Length - 1; i > 0; --i)
{
for (int j = 0; j < i; ++j)
{
if (array[j] > array[j + 1])
{
Swap(ref array[j], ref array[j + 1]);
}
}
}
}
/// <summary>
/// 选择排序
/// </summary>
/// <param name="array"></param>
static void SelectSort(Int32[] array)
{
for (int i = 0; i < array.Length; ++i)
{
int min = i;
for (int j = i + 1; j < array.Length; ++j)
{
if (array[j] < array[min])
{
min = j;
}
}
if (i != min)
{
Swap(ref array[min], ref array[i]);
}
}
}
/// <summary>
/// 调用委托[变量]
/// </summary>
/// <param name="array"></param>
/// <param name="sort">排序的类型</param>
static void Dispose(Int32[] array, Sort sort)
{
sort(array);
}
}
}
理解这段代码,我想对C#的委托概念应该会有个大概的理解了。但委托的真正应用在于事件。 事件——[—般是通知代码发生了什么事件]。GUI编程主要处理事件。在引发事件时,运行库需要知道应执行哪个方法。这就需要把处理事件的方法作为一个参数传递给委托的。
本文系个人总结,转载时请保留博客地址:http://blog.iliyang.cn