泛型(Generic)方法(函数,算法)

例子:

       static void Main(string[] args)
        {
            int[] a1 = { 1, 2, 3, 4, 5 };
            int[] a2 = { 1, 2, 3, 4, 5 };
            double[] a3 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
            double[] a4 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
            var result = Zip(a1, a2);
            Console.WriteLine(string.Join(",", result));
        }
        static int[] Zip(int[] a, int[] b)
        {
            int[] zipped = new int[a.Length + b.Length];
            int ai = 0, bi = 0, zi = 0;
            do
            {
                if (ai < a.Length) zipped[zi++] = a[ai++];
                if (bi < b.Length) zipped[zi++] = b[bi++];
            } while (ai < a.Length || bi < b.Length);
            return zipped;
        }

通过泛型方法来实现对不同类型的数组用同一种方法进行操作,如果不适用泛型则方法只能对规定的类型进行修改。

Zip方法是将两个数组你一个我一个插入到一个新的数组里并且返回。

这样不会出现成员膨胀(方法膨胀)也不会出现重复逻辑(导致需要修改的时候要每个重载方法都修改)

如何修改成泛型方法呢?
我们把Zip类中的int[]全部替换为T[]类型( int ai = 0, bi = 0, zi = 0;这句不含有[]所以不会被替换)
然后在static int[] Zip(int[] a, int[] b)的Zip后加,表示这是一个泛型方法,类型参数是T。

static T[] Zip<T>(T[] a, T[] b)

意思是,Zip是一个类型参数是T的泛型方法,它的参数是两个T类型的数组,返回一个T类型的数组

       static void Main(string[] args)
        {
            int[] a1 = { 1, 2, 3, 4, 5 };
            int[] a2 = { 1, 2, 3, 4, 5 };
            double[] a3 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
            double[] a4 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
            var result = Zip(a1, a2);
            Console.WriteLine(string.Join(",", result));
        }
        static T[] Zip<T>(T[] a, T[] b)
        {
            T[] zipped = new T[a.Length + b.Length];
            int ai = 0, bi = 0, zi = 0;
            do
            {
                if (ai < a.Length) zipped[zi++] = a[ai++];
                if (bi < b.Length) zipped[zi++] = b[bi++];
            } while (ai < a.Length || bi < b.Length);
            return zipped;
        }


当我们传入a1,a2时,我们并没有特化Zip方法

        var result = Zip(a1, a2);

说明编译器能自动推断出来T的类型,所以我们不用显示去写,这就是泛型方法在调用的时候类型参数的自动推断。

posted @ 2019-10-11 14:06  卯毛  阅读(387)  评论(0编辑  收藏  举报