引用存储为函数的类型。声明使用delegate关键字,指定一个函数的签名,包含一个返回类型和参数列表。定义委托后,可以声明该委托类型的变量。初始化该变量使为和该委托有相同函数签名的函数引用使用。就可以使用委托变量来调用这个函数。对该变量的使用就如同使用函数一样。
有了引用函数变量,可以执行其它方式无法完成的操作。:把委托变量作为参数传递给一个函数。则该函数就可以通过委托调用它引用的函数,而且在运行前不需要知道是哪个函数。
class Person { public Person(string name, int age) { this.name = name; this.age = age; } private string name;//ctrl+r+e快捷键 封装字段 public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { age = value; } } public override string ToString() { return this.name; } }
//声明委托 delegate int DelCompare(object o1, object o2); class Program { static void Main(string[] args) { //比较整数 //object[] arr = { 1, 2, 6, 8 }; //DelCompare del = IntCompare; //Console.WriteLine(GetMax(arr,del)); //比较字符串 //object[] arr = { "34sdfazca", "asfaf ", "A ad" }; //DelCompare del = StringCompare; //Console.WriteLine(GetMax(arr,del)); //比较person object[] arr ={ new Person("abc",18), new Person("asd",12), new Person("ert",70) };
//定义委托,让委托指向方法 DelCompare del = PersonCompare;
//调用委托 Console.WriteLine(GetMax(arr,del)); Console.ReadLine(); }
/*匿名方法
DelString del=delegate(string str)
{
return """ +str+ """;
};*/
//比较数组 static int IntCompare(object o1, object o2) { int i1 = (int)o1; int i2 = (int)o2; return i1 - i2; } //比较字符串长度 static int StringCompare(object o1, object o2) { string s1 = o1.ToString(); string s2 = o2.ToString(); return s1.Length - s2.Length; } //比较人大小 static int PersonCompare(object o1, object o2) { Person p1 = o1 as Person; Person p2 = o2 as Person; return p1.Age - p2.Age; } static object GetMax(object[] arr, DelCompare del) { object max = arr[0]; for (int i = 1; i < arr.Length; i++) { if (del(arr[i],max)>0) { max = arr[i]; } } return max; } }
//从小到大的排序 static void Sort(object[] arr,DelCompare del) { //冒泡的次数 for (int i = 0; i < arr.Length-1; i++) { //两两比较的次数 for (int j = 0; j < arr.Length-1-i; j++) { if (del(arr[j],arr[j+1])>0) { object tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } }