12.1.委托概述
为了减少重复代码数量,可以将比较方法作为参数传递给 BubbleSort()方法。此外,为了将方法作为参数传递,必须有一个能够标识方法的数据类型——也就是委托。这里的委托类型是 ComparisonHandler 。
class DelegateSample
{
static void Main(string[] args)
{
int[] arr = { 50, 40, 30, 20, 10 };
ConsoleArr(arr);
ComparisonHandler wx = new ComparisonHandler(DelegateSample.IsTrue);
BubbleSort(arr, wx);
-
//C#2.0之前是这么写的
//BubbleSort(arr, new ComparisonHandler(IsTrue));
ConsoleArr(arr);
Console.Read();
}
public delegate bool ComparisonHandler(int a, int b);
public static bool IsTrue(int a, int b)
{
return a > b;
}
public static void BubbleSort(int[] items, ComparisonHandler comparisonMethod)
{
int i;
int j;
int temp;
if (items == null)
{
return;
}
if (comparisonMethod == null)
{
throw new ArgumentNullException("comparisonMethod");
}
for (i = items.Length - 1; i >= 0; i--)
{
for (j = 1; j <= i; j++)
{
if (comparisonMethod(items[j - 1], items[j]))
{
temp = items[j - 1];
items[j - 1] = items[j];
items[j] = temp;
}
}
}
}
public static void ConsoleArr(int[] arr)
{
foreach (var item in arr)
{
Console.Write(item+",");
}
Console.WriteLine();
}
}
C#2.0以后可以直接调用方法
public static bool AlphabeticalIsTrue(int a,int b)
{
int comparison;
comparison = (a.ToString().CompareTo(b.ToString()));
return comparison > 0;
}
BubbleSort(arr, AlphabeticalIsTrue);
12.1.3 委托内部机制
第一个属性属于 System.Reflection.MethodiInfo 类型,MethodInfo 定义一个特定方法的签名,其中包括方法的名称、参数和返回类型。除了 MethodInfo,委托还需要一个对象实例,其中包含了要调用的方法。这正式第二个属性 Target 的用途。在静态方法的情况下,Target 对应于类型自身。
[SecuritySafeCritical]
protected Delegate(object target, string method);
[SecuritySafeCritical]
protected Delegate(Type target, string method);
12.2.匿名方法
|
请发表评论