zoukankan      html  css  js  c++  java
  • 泛型初探

    泛型是解决了什么? 

      先看下面代码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这个人类型的变量找到他的属性怎么办请看我们下篇博客,泛型的约束。

      

  • 相关阅读:
    SVN增加文件后,文件无法自动包括在项目中的原因
    关于浏览器和IIS基础的简单理解
    关联查询之速度优化
    <>这个符号表示泛型的意思
    傅里叶变换
    distinct和group by的性能比较
    VS2010 代码前出现虚线
    SQL的 like 中间字符通配 用法
    模态对话框中的window.close关闭时会打开新页面
    最大差值
  • 原文地址:https://www.cnblogs.com/-alvin/p/9281757.html
Copyright © 2011-2022 走看看