一、委託的基本聲明與使用
委託是一種數據類型 委託和類是同級的,可以用來指向一個方法。委託指向的方法參數類類型和返回值類型與委託一致。委託的基本定義與使用:
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;
}
}