委托
汉语词语的意思是:把事情托付给别人或别的机构办理。比如,生活中,我们委托律师这个对象去帮自己辩护。
在.net中委托是一种可以指向方法的数据类型。
声明委托的方式:
delegate void MyDel(int n); // delegate 返回值类型 委托类型名(参数)
为什么要使用委托?
- 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
- 引入委托后,编程人员可以把方法的引用封装在委托对象中(把过程的调用转化为对象的调用,充分体现了委托加强了面向对象编程的思想。),然后把委托对象传递给需要引用方法的代码,这样在编译的过程中我们并不知道调用了哪个方法,这样一来,C#引入委托机制后,使得方法声明和方法实现的分离,充分体现了面向对象的编程思想。
简单实现
namespace 委托
{
class Program
{
static void Main(string[] args)
{
//创建一个指向M1方法的委托对象的d1
MyDel d1 = new MyDel(M1);
//调用d1指向的方法,传入参数5
d1(5);
Console.ReadKey();
}
//声明一个方法
static void M1(int a)
{
Console.WriteLine("M1" + a);
}
}
}
namespace 委托
{
//添加public可以在其他程序集里面使用
//返回值类型和方法的返回值类型一致
public delegate void MyDel(int n);
}
加强版
namespace 委托2
{
class Program
{
static void Main(string[] args)
{
//int[] nums = new int[] { 3, 88, 9, 21 };//int[]无法直接转换为object[]类型
object[] nums=new object[] { 3, 88, 9, 21 };//装箱
//object m = GetMax(nums, new CompareFunc(CompareInt));
object m =GetMax(nums, CompareInt);//首先调用GetMax 方法,传进一个数组,一个委托
Console.WriteLine(m);
Console.ReadKey();
}
static bool CompareInt(object obj1,object obj2)
{
int i1 = (int)obj1;//拆箱时候的类型要和装箱时候的类型一致
int i2 = (int)obj2;
return i1 > i2;
}
static bool CompareFloat(object obj1, object obj2)
{
float i1 = (int)obj1;
float i2 = (int)obj2;
return i1 > i2;
}
static object GetMax(object[] nums,CompareFunc func)
{
object max = nums[0];
for (int i = 0; i < nums.Length; i++)
{
//判断func指向的方法,判断谁大
//写这段代码的人也不知道func指向的哪个方法
//只知道func指向的方法:有两个object参数,一个bool返回值
if (func(nums[i],max))
{
max = nums[i];
}
}
return max;
}
}
//如果obj1比obj2大,则返回true,否则返回false
delegate bool CompareFunc(object obj1, object obj2);
}