委托,又见面了

委托

汉语词语的意思是:把事情托付给别人或别的机构办理。比如,生活中,我们委托律师这个对象去帮自己辩护。

在.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);
}
发布了178 篇原创文章 · 获赞 178 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/luckystar_99/article/details/89439925