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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章