鲜荣彬
Herry

  泛型的概念是在C#2.0引进来的,现在普遍开发都用VS2010,即4.0的环境,因此会让大家觉得泛型在C#中理所当然的存在。

  泛型特性极大的影响了开发人员编写代码的方法和方式,与传统的弱类型集合相比,使用泛型集合能够保证编译期类型安全,并提高应用程序的执行效率。(太官方了)

  记得我刚刚接触泛型时,总是将其与C++中的模板比较学习,一方面想回味C++,一方面想弄懂泛型。当然,最后C++完全没再用过了,记得毕业做设计时,一位室友还问我MFC的问题,我才记起我曾经沉迷于C++过。

  为C#语言添加泛型需要修改C#编译器,JIT编译器及CLR。C#编译器根据C#代码生成IL语言表示的泛型类型定义,而JIT编译器则会把泛型类型定义与一系列的类型参数组合起来,从而创建出封闭的泛型类型。

  上述一段话第一次看应该会发晕,你可以背下来或者以后再看。

  泛型根据类型参数是否全部给出明确的类型,分为封闭泛型类型与开发方形类型。当然如果全部限定死了泛型类型,就是Closed Generic Type,而给出了部分类型,一部分自己可以定义,则为Open Generic Type。我在工作中用到的几乎是Closed Generic Type。

  众所周知,System.Object是所以类型的最终基类。因此意味着程序可以在此使用任意的类型,我们可以能得到任意的输入,这些任意的输入可能是我们不希望得到输入,即不可避免的导致运行时错误。这一点我体会的不是很深,工作中很少会遇到,我们会对我们希望得到的数据进行判定,因为一旦作为输入的数据异常,程序也会异常。

  泛型有两个命名空间十分重要,System.Collections.Generics与System.Collections.ObjectModel。常用的泛型有List<T>,Stack<T>,Dictionary<K,V>,SortedList<T>,LinkList<T>。也许大家觉得用泛型很牛逼,但是我听一个资深程序员说,他对自己的要求是,能够用接口就不用泛型(也许是出于灵活编程的缘由吧),从微软对这些泛型的实现可以看出来,这些泛型分别实现了IList<T>,IDicitonary<K,V>等接口。

  泛型到底能给我们带来什么好处? 凭什么我们要用它?

  我们还是来看微软的例子吧。版本1 非泛型版本

      public interface IComparable
      {
          int CompareTo(object obj);
      }

     另外一个泛型版本  版本2 泛型版本

   public interface IComparable<in T>
     {
          int CompareTo(T other);
     }

  怎么能看出泛型的优势呢?请看下面例子?

  如果是用非泛型版本,

     public int CompareTo(object right)
        {
            if (!(right is Customer))
            {
                throw new ArgumentException("right 不是一个 Customer对象");
            }
            Customer rightCustomer = (Customer)right;
            return Name.CompareTo(rightCustomer.Name);
        }

  泛型版本

       public int CompareTo(Customer right)
        {
            return Name.CompareTo(right.Name);
        }

  当然,这里只是一种假设,只是告诉我们,如果不使用泛型,那么我们需要对我们传入进来的参数进行强有力的判定,否则会引起异常,因为Object是所以类的基类。从上面的例子我们可以看到,使用泛型版本更加简洁,更加高效(无需过多错误检查,如果你往里面传了个String类型的参数,我们肯定是不能编译通过的),避免了所有box及拆箱类型转换,不会抛出异常,而非泛型版本中可能出现的运行时异常由编译器捕获。

  上面扯了这么多,一句话概况:只要指定不通的类型参数,即可重用泛型。

  谈到重用,就不得不提模式。模式的作用就在于标准化那些尚未被语言或框架直接支持的常见算法逻辑。遵循模式即可解决一类常见的问题。而泛型类能够帮组我们实现很多常用的、可重用的模式。模式的学习也许最好的就是从微软的net框架中学习。模式的本质在于它必定包含一系列通用的算法和代码,支持应用于应用程序中各种特定类型上。下一篇我会继续将所学的陈列出来。。。。。

  

  

 

  

 

  

  

posted on 2013-03-24 21:58  Herry彬  阅读(1113)  评论(0编辑  收藏  举报