一、委托的基本声明与使用
委托是一种数据类型 委托和类是同级的,可以用来指向一个方法。委托指向的方法参数类类型和返回值类型与委托一致。委托的基本定义与使用:
class Program
{
delegate void Mydl(int a);//声明一个委托
static void M1(int a)//声明一个和委托类型返回参数的方法
{
Console.Write(a);
}
static void Main(string[] args)
{
Mydl d = new Mydl(M1); //委托指向方法
d(5);//执行委托
}
}
二、一个委托的的运用案例及优化改造
此处以获取一个数组中的最大值(数组类型不固定)为例,进行委托的运用和优化。
class Program
{
delegate bool Compare(object obj1, object obj2);//定义委托比较两个对象大小
static object GetMax(object[] objs, Compare func)//构建获取数组最大值的方法 方法中无法将对象比较 用委托指向比较方法
{
object max = objs[0];
for (int i = 0; i < objs.Length; i++)
{
if (func(objs[i], max))
{
max = objs[i];
}
}
return max;
}
static bool CompareInt(object obj1, object obj2)//整形对象比较方法
{
int i1 = (int)obj1;
int i2 = (int)obj2;
return i1 > i2;
}
static bool ComparePerson(object obj1, object obj2)//Person对象类型比较方法
{
Person i1 = (Person)obj1;
Person i2 = (Person)obj2;
return i1.age > i2.age;
}
static void Main()
{
整数数组的比较
object[] nums = new object[] { 14, 12, 8, 100 };//装箱
object result = GetMax(nums, CompareInt);//等价于object result=GetMax(nums,new Compare(CompareInt));
Console.WriteLine(result);
Person类型数组的比较
Person p1 = new Person();
p1.age = 100; p1.name = "Bob";
Person p2 = new Person();
p2.age = 15; p2.name = "Len";
Person[] persons = new Person[] { p1, p2 };
object m = GetMax(persons, ComparePerson);
Console.WriteLine(m);
}
}
public class Person
{
public int age { get; set; }
public string name { get; set; }
public override string ToString()
{
return "age=" + this.age + "name=" + this.age;
}
}
利用泛型和匿名方法将以上代码进行优化
class Program
{
delegate bool Compare<T>(T obj1, T obj2);//声明泛型委托
static object GetMax<T>(T[] nums, Compare<T> func)//声明泛型方法
{
T max = nums[0];
for (int i = 0; i < nums.Length; i++)
{
if (func(nums[i], max)) { max = nums[i]; }
}
return max;
}
static void Main()
{
///整形比较
int[] nums = new int[] { 14, 12, 8, 100 };
Compare<int> f1 = delegate (int i1, int i2){return i1 > i2;};//整数比较的匿名方法
object result = GetMax(nums, f1);
Console.WriteLine(result);
Person类型数组的比较
Person p1 = new Person();
p1.age = 100; p1.name = "Bob";
Person p2 = new Person();
p2.age = 15; p2.name = "Len";
Person[] persons = new Person[] { p1, p2 };
Compare<Person> f2 = delegate (Person i1, Person i2) { return i1.age > i2.age; };//Person比较的匿名方法
object m = GetMax(persons, f2);
Console.WriteLine(m);
}
}
public class Person
{
public int age { get; set; }
public string name { get; set; }
public override string ToString()
{
return "age=" + this.age + "name=" + this.age;
}
}
三、C#内置委托 Func和Action
Func是有返回值的委托 最后一个参数是返回值
Action是没有返回值的委托
一般在正常开发过程中不用自己定义委托 用内置委托即可解决问题
利用内置Func 委托改写上面的代码,可以直接省略委托的定义。
class Program
{
static object GetMax<T>(T[] nums, Func<T,T,bool> func)
{
T max = nums[0];
for (int i = 0; i < nums.Length; i++)
{
if (func(nums[i], max)) { max = nums[i]; }
}
return max;
}
static void Main()
{
///整形比较
int[] nums = new int[] { 14, 12, 8, 100 };
Func<int,int,bool> f1 = delegate (int i1, int i2){return i1 > i2;};//整数比较的匿名方法
object result = GetMax(nums, f1);
Console.WriteLine(result);
Person类型数组的比较
Person p1 = new Person();
p1.age = 100; p1.name = "Bob";
Person p2 = new Person();
p2.age = 15; p2.name = "Len";
Person[] persons = new Person[] { p1, p2 };
Func<Person, Person, bool> f2 = delegate (Person i1, Person i2) { return i1.age > i2.age; };//Person比较的匿名方法
object m = GetMax(persons, f2);
Console.WriteLine(m);
}
}
public class Person
{
public int age { get; set; }
public string name { get; set; }
public override string ToString()
{
return "age=" + this.age + "name=" + this.age;
}
}