泛型初探

泛型是解决了什么? 

  先看下面代码1

   class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
   class Common
    {
        public static void ShowInt(int iParamter)
        {
            Console.WriteLine("这里是Common.ShwoInt={0},paramterType={1}",iParamter,iParamter.GetType());
        }

        public static void ShowDateTime(DateTime dParamter)
        {
            Console.WriteLine("这里是Common.DateTime={0},paramterType={1}", dParamter, dParamter.GetType());
        }

        public static void ShowPeople(People pParamter)
        {
            Console.WriteLine("这里是Common.ShowPeople={0},paramterType={1}", pParamter, pParamter.GetType());
        }

    }

  下面是使用

  

      static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            DateTime dt = DateTime.Now;
            int i = 17878;
            People p = new People()
            {
                Name = "张三",
                Age = 22
            };
            Common.ShowInt(i);
            Common.ShowDateTime(dt);
            Common.ShowPeople(p);

            Console.ReadKey();

        }

  可以看到,3个方法都是去做的同一件事情但是却因为类型的不同去写3个方法,极大地浪费了我们的效率。

  读到这是,朋友可能有了一个方法可能是给Common类添加一个这个样子的方法

      public static void ShowObj(object oParamter)
        {
            Console.WriteLine("这里是Common.ShowObj={0},paramterType={1}", oParamter, oParamter.GetType());
        }

  在调用是都是用这个变量i,p, dt这三种不同类型的变量都去滴啊用ShowObj方法。这样做可以实现,但是却产生了一个效率问题,在调用时候会进行一个装箱的操作。我们应该尽量去避免这种情况。

  这时候出现了泛型方法,先来看一下这个代码 2

  

     /// <summary>
        /// 方法声明    不指定参数类型,而推至到使用的时候才制定参数类型
        /// 延迟思想
        /// 
        /// </summary>
        /// <typeparam name="T">占位符号</typeparam>
        /// <param name="tParamter">T类型参数</param>
        public static void ShowT<T>(T tParamter)
        {
            Console.WriteLine("这里是Common.ShowT={0},paramterType={1}", tParamter, tParamter.GetType());
        }

再来看看调用

  

   class Program
    {
        static void Main(string[] args)
        {
            DateTime dt = DateTime.Now;
            int i = 17878;
            People p = new People()
            {
                Name = "张三",
                Age = 22
            };
            
           GenericClass.ShowT<int>(i);
            GenericClass.ShowT<DateTime>(dt);
            GenericClass.ShowT(p);
            GenericClass.ShowT(p1);
        }
    }            

  泛型比我们写过的普通代码多了一个<T>,这是什么那?

    这里的T是一个类型的占位符,T可以随便写,只要不写系统保留字就可以。在调用时候穿一个类型我们就可以使用(也可以不写<>)。那么他们的本质是什么?

    <T>在编译阶段会被编译为`1在调用的时候会产生一个副本,比如:

    GenericClass.ShowT(p);会被编译成为一个参数为People类型的方法方法体是一样的。这样不会损失效率。
但是如果这个ShowT方法想对P这个人类型的变量找到他的属性怎么办请看我们下篇博客,泛型的约束。

  

猜你喜欢

转载自www.cnblogs.com/-alvin/p/9281757.html