委托只是一种特殊类型的对象,区别是其他对象包含数据,委托包含的是一个或多个方法的地址。
这里涉及一个概念:以函数作为参数的函数叫高阶函数。
private delegate void string GetStr()
public static void main()
{
int x = 100;
GetStr dGetStr =new GetStr(x.ToString);
//或者:编译器会通过声明的类型检测需要的委托类型,自动创建委托的一个实例
dGetStr =x.ToString;
Console.WriteLine(“stringis {0}”, dGetStr);
}
C#中可用的委托类型:
Action<T>:可传递不同的参数类型和个数
Func<in T, out TResult>:可传递不同的参数类型和个数,和一个返回值
例,自定义类的排序:
class BubbleSorter
{
static public voidSort<T>(IList<T> arrSort, Func<T, T, bool> comparison)
{
for (int j = arrSort.Count- 1; j > 0; j--)
{
for (int i = 0; i < j; i++)
{
if(comparison(arrSort[i + 1], arrSort[i]))
{
T temp =arrSort[i];
arrSort[i] =arrSort[i + 1];
arrSort[i + 1]= temp;
}
}
}
}
}
class User
{
public int Id { get; privateset; }
public string Name { get;private set; }
public int Age { get; privateset; }
public User(int id, stringname, int age)
{
this.Id = id;
this.Name = name;
this.Age = age;
}
public static boolCompareAge(User u1, User u2)
{
return u1.Age < u2.Age;
}
}
class Test
{
public static void main()
{
User[] users =
{
new User(1,"user1", 20),
new User(2,"user2", 10),
new User(3, "user3", 15),
new User(4,"user4", 10),
};
BubbleSorter.Sort(users,User.CompareAge);
}
}
匿名方法:
Func<string, string, string> tDel = delegate(string param1, string param2)
{
return param1 + param2;
}
Console.WriteLine(tDel("I'm String1", "I'm String2"));
C#3.0 开始可以使用Lambda表达式,这样就不需要提供匿名方法的参数。
Lambda表达式:
Func<string, string, string> tLambda = (param1, param2) => param1 + param2;
Console.WriteLine(tLambda("I'm String1", "I'm String2"));
实现代码多行时,不需要加花括号。
Lambda表达式可以使用外部的变量。