Action<T>和Func<T>委托


除了为每个参数和返回类型定义一个新委托类型之外,还可以使用Action<T>和Func<T>委托     
泛型Action<T>委托表引用一个void返回类型的方法,因为这个委托类存在不同的变体,所以可以传递至多16种不同的参数类型。没有泛型参数的Action类可以调用没有参数的方法。Action<in T>调用带一个参数的方法,Action<in T1,in T2>调用带两个参数的方法          
Func<T>委托可以以类似的方式使用,Func<T>允许调用带返回类型的方法,至多可以传递16参数和一个返回类型,例如Func<in T1,in T2,out TResult>带有两个参数一个返回类型的委托
下面以一个排序来了解一下委托的真正用途:对对象排序
参数comparison必须引用一个方法,该方法带有2个参数,返回类型为bool类型

static public void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
{
bool swapped = true;
do
{
swapped = false;
for (int i = 0; i < sortArray.Count-1; i++)
{
if (comparison(sortArray[i+1],sortArray[i]))
{
T temp = sortArray[i];
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
swapped = true;
}
}

} while (swapped);
}

定义一个类Employee然后根据他们的薪水进行排序

class Employee
{
public Employee(string name, decimal salary)
{
this.Name = name;
this.Salary = salary;
}
public string Name { get; private set; }
public decimal Salary { get; private set; }
public override string ToString()
{
return string.Format("{0},{1:C}",Name,Salary);
}
public static bool CompareSalary(Employee e1, Employee e2)
{
return e1.Salary < e2.Salary;
}
}

为了匹配Func<T,T,bool>委托的签名,类中必须定义CompareSalary,他的前两个参数为Employee引用,返回类型为bool

static void Main(string[] args)
{
Employee[] employees =
{
new Employee("Bugs Bunny",20000),
new Employee("Elmer Fudd",10000),
new Employee("Daffy Duck",25000),
new Employee("Wile Coyote",100000),
new Employee("RoadRunner",50000)
};
Sort(employees, Employee.CompareSalary);
foreach (var employee in employees)
{
Console.WriteLine(employee);
}

}

输出:

Elmer Fudd,¥10,000.00 
Bugs Bunny,¥20,000.00
Daffy Duck,¥25,000.00
RoadRunner,¥50,000.00
Wile Coyote,¥100,000.38





posted @ 2012-03-13 16:37  Lordbaby  阅读(240)  评论(1)    收藏  举报