泛型(Generic)

泛型 Generic

什么是泛型:泛型在我们编程时候是无处不在无处不用。在说明之前看一段下面代码:

List<int> intlist = new List<int>(); // 定义一个int类型集合
List<string> stringlist = new List<string>();//定义 string类型的集合

这里先告诉大家这是List一个泛型类,这个List相信大家在开发当中用的很频繁了。  下面看一下官网对泛型的定义,因英语不好只能翻译成中文:

泛型(Generic)

看到这个概念或许会有不理解地方。为了通俗易懂用泛型方法来举例子探究一下究竟什么是泛型。

        static void Main(string[] args)
        {
            int iValue = 717;
            string strValue = "Dolphin";

            ShowInt(iValue);
            ShowString(strValue);

        }
        public static void ShowInt(int iParameter)
        {
            Console.WriteLine($"This is parameter={iParameter.GetType().Name},type={iParameter}");
        }
        public static void ShowString(string sParameter)
        {
            Console.WriteLine($"This is parameter={sParameter.GetType().Name},type={sParameter}");
        }     

 

以上代码两个方法 分别是int,string类型传递参数,但是方法动作都是打印结果。

如果说我要在加一个datetime类型来传递干的事都是一样的话,是不是还得增加一个叫showDatetime的方法呢? 如果我要在加好几个类型的话只能有增加的方法来解决呢?

在泛型出来之前有关于这种类型的解决方法---object类型。

为什么Object定义的参数可以传递 Int,String参数呢?

         1. object是所有类型的基类。(万物皆Object)

         2.(任何基类出现的地方都可以使用子类来代替)里面氏替换 原则。

        public static void ShowObject(object oParameter)
        {
            Console.WriteLine("This is parameter={0},type={1}",
                 oParameter.GetType().Name, oParameter);
        }

这样刚刚好解决了不同类型的问题,但是还是会出现两个问题:

1.性能问题(装箱拆箱) 其实就是类型换对性能的损耗-----引用类型与值类型之间转换消耗性能。

2.类型不安全。

那该如何解决这方面的问题呢?

这就需要我们今天的主角泛型该登场了。首先看一下定义:

public static void Show<T>(T tParameter)
        {
            Console.WriteLine("This is parameter={0},type={1}",
                  tParameter.GetType().Name, tParameter);
        }

但是为什么泛型就可以解决Object的方式的问题呢? 先做个如下测试:

        public static void Show()
        {
            Console.WriteLine("****************Monitor******************");
            {
                int iValue = 12345;
                long commonSecond = 0;
                long objectSecond = 0;
                long genericSecond = 0;

                {
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    for (int i = 0; i < 100_000_000; i++)
                    {
                        ShowInt(iValue);//直接定义int类型
                    }
                    watch.Stop();
                    commonSecond = watch.ElapsedMilliseconds;
                }
                {
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    for (int i = 0; i < 100_000_000; i++)
                    {
                        ShowObject(iValue);//转换成object
                    }
                    watch.Stop();
                    objectSecond = watch.ElapsedMilliseconds;
                }
                {
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    for (int i = 0; i < 100_000_000; i++)
                    {
                        Show<int>(iValue);//使用泛型
                    }
                    watch.Stop();
                    genericSecond = watch.ElapsedMilliseconds;
                } 
                Console.WriteLine($"commonSecond={commonSecond},objectSecond={objectSecond},genericSecond={genericSecond}");
            }
        }

        private static void ShowInt(int iParameter)
        {
            //do nothing
        }
        private static void ShowObject(object oParameter)
        {
            //do nothing
        }
        private static void Show<T>(T tParameter)
        {
            //do nothing
        }

 

这里做了测试 一个为普通类型,object,泛型方法来验证性能消耗。

代码逻辑为每个方法循环100_000_000次 每个方法里什么操作都没有做 只是调用输出运行结果。

运行结果:

泛型(Generic)

 由此看普通类型和泛型结果颇为相似,可以证明泛型是解决了object的性能消耗问题。

 

写了一个小时。。。才写了这么点。。明天继续写。。。。。

上一篇:通过一个简单的案例看懂量子计算机


下一篇:000.算法经验总结