泛型

        早在机房收费系统的时候就开始学习和使用泛型了,那是并不很清楚泛型和泛型集合的区别,一直以为泛型集合就是泛型。

    后来继续学习,认识到泛型和泛型集合之间的区别,却不清楚到底体现在哪。

    通过这次技术分享,到现在才对泛型有了一个比较清晰的认识,既是一种收获和成长,同时也很惭愧,对这些非常常用的技术并没有进行过深入研究。

    在以后的学习中,还是要善于研究问题,不能总是“见过”——看见就过了。

    下面将从基本的概念开始好好分析一下泛型。

    先从百度抄一段概念:泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。这里的可变部分是关键,指的就是类型参数,这个不懂没关系,我们下面分析

    1、我们为什么要用泛型?

    先看如下的两段代码:

public class Cat
   {
        public void CountEars(int[] catEars)
        {
            //定义一个数耳朵的方法
            int length = catEars.Length;
            for (int i = 0; i < length-1; i++)
            {
                Console.WriteLine(length+"int类型参数");
            }
        }                                                                                                                  
        public void CountEars(string[] catEars)
        {
            //定义一个数耳朵的方法
            int length = catEars.Length;
            for (int i = 0; i < length-1; i++)
            {
                Console.WriteLine(length+"string类型参数");
            }
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            #region  没有泛型前的演示
            Cat cats = new Cat();

            int[] catInt = { 1, 2, 3, 4, 5 };//这些猫称为1/2/3/4/5
            byte[] catString = { 1, 2, 3, 4, 5 };

            //输出数组长度
            cats.CountEars(catInt)

            //输出数组长度
            cats.CountEars(catString);

            没有泛型的话, 如果 我还要使用其他参数类型的同名方法的话,还要继续写其他的方法,这样我们看着肯定非常不舒服,也非常麻烦,而这样也不符合科学的计算机编程。

    那么我们面对这种情况,该怎么用泛型?接着看泛型类和泛型方法的使用。


    2、泛型类与泛型方法

    泛型类:   

      public class Cat<span style="font-family: Arial, Helvetica, sans-serif;"><T></span>
      {                                                                                                                                                          public void CountEars(T[] catEars)
            //定义一个数猫耳朵的方法
            int length = catEars.Length;
            for (int i = 0; i < length-1; i++)
            {
                Console.WriteLine(length+"泛型类型参数");
            }
       }                                                                                                              }

              

     泛型方法:      

//定义一个数耳朵的方法
public void CountEars(T[] catEars)      
{ 
    int length = catEars.Length;
    for (int i = 0; i < length - 1; i++) 
    { 
        Console.WriteLine(length + "泛型类型参数");
    } 
}
 

    为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。    

    为什么使用泛型类呢?使用泛型类可以解决重复业务的代码的复用问题,也就是业务颗粒的复用,同时使用泛型类型在编译阶段就可以确定,并发现错误,类型的转换都是自动和隐式的,提高了代码的准确率和复用率。

    3、泛型、集合、泛型集合

    告诉大家三个字:先别乱!

    集合:如ArrayList类,是命名空间System.Collections下的一部分,它是使用大小可按需动态增加的数组实现IList接口,但是ArrayList不是类型安全的。同样,Hashtable也是集合类的一种。

    ArrayList arraylist = new ArrayList();
    arraylist.Add("a");
    arraylist.Add("b");
    arraylist.Add("c");
    arraylist.RemoveAt(1);
    Response.Write(arraylist[0].ToString());
    Response.Write(arraylist[1].ToString());

    这是一个集合的例子。ArrayList必须通过创建一个实例必须进行实例化,不能像数组那样直接赋值通过Add()方法添加元素,然后通过RemoveAt方法删除元素,它的索引会自动调整。

    ArrayList添加元素时都是 object类型,如果添加一个值类型,就需要把它转化为引用类型,这里就需要装箱,拆箱。而这正是集合类型不安全的体现,有的语言中提供了隐式拆装箱的机制,这还会导致效率降低。


    泛型集合:如List类,是对ArrayList的一个完善。通常情况下建议使用泛型集合,因为这样可以获得类型安全的直接优点。同时,Dictionary也是泛型集合类。

     List<string> aList = new List<int>();
     aList.Add("a");
     aList.Add("b");
              此时,如果我在上面的代码中加入一行:aList.Add(1.0),此时编译器就会报错。为什么?

    因为泛型是类型安全的,它不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,它在编译期间就会提示你类型错误,1.0显然不是string类型。


    泛型:泛型我们指的就是实现IList接口的数组之类的集合类型,它存储的是其父类型,而实现使用时声明好子类型。参考泛型集合类的实现过程,我们发现,泛型和泛型集合,实际上是同一概念。    


    小结:一般情况下,我们优先考虑强制类型,如定义一个string类型;其次考虑泛型,最后考虑集合。泛型是基础的必须好好掌握的技术点,需要我们好好研究和实践。

    

    

    

    

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值