C#委托(泛型委托、内置委托、匿名方法)

一、委托的基本声明与使用

  委托是一种数据类型  委托和类是同级的,可以用来指向一个方法。委托指向的方法参数类类型和返回值类型与委托一致。委托的基本定义与使用:

   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;
        }
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值