下方例子来源于B站UP主SunnieShine的C#专栏第48讲,个人觉得讲的非常好。
//参考冒泡排序,如果想设计一个对字符串的冒泡排序该怎么处理?如下:
namespace ConsoleIdeaTest
{
public delegate int Comparison(string left, string right); //声明委托类型,写着像方法,实际是类
//delegate是声明委托类型的专用修饰符,Comparison是委托类型名
//注意委托类型的变量数量、类型一定要和要在委托实例中想委托的方法一致
class Program
{
static void Main(string[] args)
{
string[] arr = { };
Comparison comparisonMethod = new Comparison(Compare);//委托类型的实例调用compare方法,注意此处是直接把方法名当变量来传递了
//委托的实例调用的方法Compare就叫回调函数
//本例中声明的委托类型需要两个string,而我们声明的具体的比较方法就是需要两个string
Order.Sort(arr, comparisonMethod);//冒泡排序方法第二个参数需要委托类型的实例,在第42行声明的
foreach (string i in arr)
{
Console.WriteLine("{0},",i);
}
}
static int Compare(string a, string b) //被调用方法的变量类型、数量与委托类型需要一致
{
if (a.Length > b.Length)
return 1;
else if(a.Length < b.Length)
return -1;
for (int i = 0; i < a.Length; i++)
{
if (a[i] > b[i])
return 1;
else if (a[i] < b[i])
return -1;
}
return 0;
}
}
class Order
{
public static void Sort(string[] array, Comparison comparison)
{
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = 0; j < array.Length - 1 - i; j++)
{ //下面的if语句,表面上是调用comparison,实际上在主函数的变量中实例回调了Compare去对比array[j]和array[j+1]
if (comparison.Invoke(array[j], array[j + 1]) >= 0) //Invoke是“调用”的意思,也可以理解成“回调”,可以省略掉。
{
string temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
}
}
上述代码是举例说明委托的用法之一:回调函数。
实际上如果不像上述代码中一下设计,个人觉得也可以Sort方法需要第二个参数bool,然后在主函数中定义变量让其接受Compare返回的bool值,再用该变量来传入Sort方法做第二个参数。但整理逻辑就会比上述代码的写法更麻烦,而且上述方法也只是最简单的应用,后续学习的内容会更需要委托。